Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2007, 12:53   #1
pkv
Пользователь
 
Регистрация: 26.09.2007
Сообщений: 12
По умолчанию Не работает MS-SQL-запрос

Имеются две таблицы (MS SQL), связанные один-ко-многим. Пытаюсь дополнительно отфильтровать ту, которая ко-многим в Delphi. Ничего не получается. Причем запрос работает - выводится первая запись по ID для главной таблицы и ВСЕ записи для подчиненной! Примерный текст запроса:

Код:
With DataModule2.ADOQuery2 do begin
      Close;
      SQL.Clear;
      SQL.Add('SELECT ls.Number,ls.Description,Param1.Number,Param1.Name,Param1.Date1,Param1.Date2 ');
      SQL.Add('FROM ls,Param1 ');
      SQL.Add('WHERE Param1.Date2 IS NULL ');
      SQL.Add('AND Param1.Number = ls.Number ');
      Open;
   end;
   DataModule2.DataSource1.DataSet := DataModule2.ADOQuery2;
pkv вне форума Ответить с цитированием
Старый 30.10.2007, 13:43   #2
Aristarh Dark
Форумчанин
 
Регистрация: 07.08.2007
Сообщений: 154
По умолчанию

Попробуй так:
Код:
SELECT LS.Number, LS.Description, PARAM1.Name, PARAM1.Date1
FROM LS left join PARAM1 on LS.Number = PARAM1.Number
WHERE PARAM1.Date2 IS NULL
поля PARAM1.Number и PARAM1.date2 из результирующей выборки исключил ввиду отсутствия смысла их вывода, т.к. PARAM1.Number = LS.Number и PARAM1.Date2 - пустое по условию фильтра
Aristarh Dark вне форума Ответить с цитированием
Старый 30.10.2007, 15:44   #3
pkv
Пользователь
 
Регистрация: 26.09.2007
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Aristarh Dark Посмотреть сообщение
Попробуй так:
Код:
SELECT LS.Number, LS.Description, PARAM1.Name, PARAM1.Date1
FROM LS left join PARAM1 on LS.Number = PARAM1.Number
WHERE PARAM1.Date2 IS NULL
поля PARAM1.Number и PARAM1.date2 из результирующей выборки исключил ввиду отсутствия смысла их вывода, т.к. PARAM1.Number = LS.Number и PARAM1.Date2 - пустое по условию фильтра
Люминь! Должно работать! НЕ Р-А-Б-О-Т-А-Е-Т !!! Из таблицы LS все записи пропадают. Таблица PARAM1 на условия фильтра не реагирует! Чуть не забыл, таблицы вызываются в разных формах.
pkv вне форума Ответить с цитированием
Старый 30.10.2007, 19:52   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Рассмотрим кусок
Цитата:
SQL.Add('FROM ls,Param1 ');
SQL.Add('WHERE Param1.Date2 IS NULL ');
Надеюсь, вы понимаете, что для первой таблицы это условие не будет выполнено НИКОГДА?
mihali4 вне форума Ответить с цитированием
Старый 31.10.2007, 05:31   #5
Aristarh Dark
Форумчанин
 
Регистрация: 07.08.2007
Сообщений: 154
По умолчанию

Значит нет пустых дат в таблице PARAM1
Aristarh Dark вне форума Ответить с цитированием
Старый 31.10.2007, 09:13   #6
pkv
Пользователь
 
Регистрация: 26.09.2007
Сообщений: 12
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Рассмотрим кусок

Надеюсь, вы понимаете, что для первой таблицы это условие не будет выполнено НИКОГДА?
Убираю условие WHERE - эффекта никакого!
pkv вне форума Ответить с цитированием
Старый 31.10.2007, 21:40   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Убираю условие WHERE - эффекта никакого!
Я так понимаю, имеется в виду:
Код:
SQL.Add('SELECT ls.Number,ls.Description,Param1.Number,Param1.Name ,Param1.Date1,Param1.Date2 ');
SQL.Add('FROM ls,Param1 ');
Значит, что-то с полями напортачили (при условии, что таблицы не пусты и не сбоят). А может, у вас в первой таблице всего одна запись? Тогда все нормально.
Проверим так:
Код:
SQL.Add('SELECT * FROM ls,Param1');
Должны выбраться абсолютно все записи из обеих таблиц, причем каждой записи в первой таблице будет соответствовать набор ВСЕХ записей из второй.
Что-то вроде этого вы упоминали в самом начале. Так?
Честно говоря, я так и не понял, какой результат вы хотите получить из выборки... на словах можете объяснить?

Последний раз редактировалось mihali4; 01.11.2007 в 01:49.
mihali4 вне форума Ответить с цитированием
Старый 01.11.2007, 14:32   #8
pkv
Пользователь
 
Регистрация: 26.09.2007
Сообщений: 12
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Я так понимаю, имеется в виду:
Код:
SQL.Add('SELECT ls.Number,ls.Description,Param1.Number,Param1.Name ,Param1.Date1,Param1.Date2 ');
SQL.Add('FROM ls,Param1 ');
Значит, что-то с полями напортачили (при условии, что таблицы не пусты и не сбоят). А может, у вас в первой таблице всего одна запись? Тогда все нормально.
Проверим так:
Код:
SQL.Add('SELECT * FROM ls,Param1');
Должны выбраться абсолютно все записи из обеих таблиц, причем каждой записи в первой таблице будет соответствовать набор ВСЕХ записей из второй.
Что-то вроде этого вы упоминали в самом начале. Так?
Честно говоря, я так и не понял, какой результат вы хотите получить из выборки... на словах можете объяснить?
Кажется, получилось. Добавил всего две строчки: установил DBGrid1.DefaultDrawing = False, выполнил запрос и вернул True. ВКРАТЦЕ суть проблемы - пропадали записи из главной таблицы при выполнении ЛЮБОГО запроса при наложении фильтра на подчиненную таблицу. Коряво, но это сработало!!!
pkv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает перекрестный запрос Unlimit БД в Delphi 2 15.05.2008 18:26
Не работает SQL запрос EVG44 БД в Delphi 4 21.10.2007 22:28
Не работает запрос Prisian БД в Delphi 1 30.08.2007 17:33
sql запрос работает неверно :( Vasya БД в Delphi 4 26.08.2007 14:59
Запрос неправильно работает... yulia БД в Delphi 0 27.05.2007 20:41