Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему не правильно работает такой запрос? [D7, Access]


Tornado ©   (2008-03-28 14:30:00) 

with DM.mdQueryP do begin
      Close;
      SQL.Clear;
      SQL.Add('SELECT * FROM vtg_sr WHERE PR=:PR UNION ALL     SELECT * FROM Arz_sr WHERE PR=:PR');
      Parameters.ParamByName('PR').Value := 'РУКОВОДСТВО';
      Active := True;
 end;

Делаю выборку из двух тоблиц с объединением, выбират почему то только из первой таблицы (vtg_sr)? а из таблицы Arz_sr  - не выбирает...в чем может быть дело?


sniknik   (2008-03-28 20:20:00) [1]

> там тоже обращение было только к первому из одноименных, остальные игнорировались
там может и были обращения только к первому но сам движок тогда разбирал остальные (поддержка любителей одноименных параметров?)

простая проверка BDE
код для чтения из таблици с ID и существующим значением 1  
Query1.SQL.Text:= 'SELECT ID, :ID AS ID2 FROM Table1 WHERE ID=:ID';
Query1.ParamByName('ID').AsInteger:= 1;
Query1.Open;

результат из 2х еденичек
ID ID2
1   1
видно что разовое присваивание инициировало оба параметра. как, на каом этапе неважно.
если бы инициировался только первый, условие бы не сработало.


Павел Калугин   (2008-03-28 18:10:00) [2]


> sniknik ©   (28.03.08 17:55) [15]

Так и  мне кажется что там индекс первичен а byName вторично.


Правильный_Вася   (2008-03-28 18:08:00) [3]


>  вот был бы у него BDE... (насколько помню там позволялись
> одноименные)

ЕМНИП, там тоже обращение было только к первому из одноименных, остальные игнорировались
хотя могу врать, давно уже не делаю одноименных


sniknik   (2008-03-28 17:55:00) [4]

> но 2 параметра с одним именем уже не совсем легально:)
зависит от способа доступа, вот был бы у него BDE... (насколько помню там позволялись одноименные)

в принципе и тут можно если не по имени а по индексу значения присваивать.


Павел Калугин   (2008-03-28 17:44:00) [5]


> Правильный_Вася   (28.03.08 15:22) [10]

но 2 параметра с одним именем уже не совсем легально:)


sniknik   (2008-03-28 16:33:00) [6]

> нужно чтобы эти данные физически содержались в разных таблицах :)
все обман... (вернее само...) данные "физически" в разных таблицах, находятся в одном файле базы... т.е. деление на таблицы чисто логикой движка обеспечивается... (т.е. сделал структуру такую чтобы тебе их предоставляли как две, чтобы было понеудобнее запросы выполнять... мазохизм какойто)


Tornado   (2008-03-28 15:40:00) [7]

Sergey13 ©   (28.03.08 15:25) [11]

Все правильно говоришь, но так нужно чтобы эти данные физически содержались в разных таблицах :)


Sergey13   (2008-03-28 15:25:00) [8]

> [4] Tornado ©   (28.03.08 14:55)
> Таблицы одинаковые абсолютно по структуре

Значит таблица должна быть одна. 8-)


Правильный_Вася   (2008-03-28 15:22:00) [9]


>  Странно что сообщения об ошибке не было

чего странного?
NULL - вполне легальное значение


Tornado   (2008-03-28 15:07:00) [10]

Павел Калугин ©   (28.03.08 15:00) [6]

Да, так работает, всем спасибо!


Павел Калугин   (2008-03-28 15:02:00) [11]

а вначале запрос после подстановки выглядит как
SELECT * FROM vtg_sr WHERE PR='РУКОВОДСТВО' UNION ALL     SELECT * FROM Arz_sr WHERE PR=NULL
ибо в нем 2 параметра. Странно что сообщения об ошибке не было


Sergey13   (2008-03-28 15:01:00) [12]

> [5] Tornado ©   (28.03.08 14:59)

Попробуй с двумя параметрами.
'SELECT * FROM vtg_sr WHERE PR=:PR1 UNION ALL     SELECT * FROM Arz_sr WHERE PR=:PR2'

Инога встречаются такие проблемы


Павел Калугин   (2008-03-28 15:00:00) [13]

SQL.Add('SELECT * FROM vtg_sr WHERE PR=:PR1 UNION ALL     SELECT * FROM Arz_sr WHERE PR=:PR2');
     Parameters.ParamByName('PR1').Value := 'РУКОВОДСТВО';
     Parameters.ParamByName('PR2').Value := 'РУКОВОДСТВО';


Tornado   (2008-03-28 14:59:00) [14]

Кстати попробовал написать так:

SELECT * FROm Vtg_sr WHERE PR=''РУКОВОДСТВО'' UNION ALL SELECT * FROM Arz_sr WHERE PR=''РУКОВОДСТВО''

Так работает нормально, как надо ... Хм, странно. Но мне надо с параметрами...


Tornado   (2008-03-28 14:55:00) [15]

Таблицы одинаковые абсолютно по структуре


Tornado   (2008-03-28 14:54:00) [16]

>> Sergey13 ©   (28.03.08 14:52) [2]

Без проблем выбирает если так написать: (без UNION ALL)

SQL.Add('SELECT * FROM Arz_LPUMG_sr WHERE PR=:PR');


Sergey13   (2008-03-28 14:52:00) [17]

А просто из второй таблицы (типа выбросить первую часть запроса) выбирает?


Tornado   (2008-03-28 14:31:00) [18]

И там и там в таблицах есть значение "РУКОВОДСТВО" в столбце PR


Наверх

Титульная страница Поиск, карта сайта Написать письмо