![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему не правильно работает такой запрос? [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