Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.16;
Скачать: CL | DM;

Вниз

Как сделать запрос к результату запроса.   Найти похожие ветки 

 
ViktorZ ©   (2006-02-17 22:14) [0]

Как применить к результату запроса еще одно условие.
Есть запрос вида:

SELECT A.*, AD.* FROM Acheck A, Adcheck AD, WHERE A.LogicDate BETWEEN :P1 AND :P2  AND A.Sys_Num = AD.Sys_Num AND AD.Sifr = :P3

из него я получаю диапазон Sys_num, по которому мне нужно выбрать sifr из третье таблицы ARCHECK.

Пишу:

SELECT AR.* FROM ARcheck AR
WHERE AR.SYS_NUM=(Select A.* , AD.* FROM acheck A, ADCheck AD WHERE A.LogicDate BETWEEN "01.01.2006" AND "24.01.2006" AND A.Sys_Num=AD.Sys_Num AND AD.Sifr = 15)

ОН не работает. Пишет Ошибку: single row subquery produced more than one row.
Хотя так вроде привычно все на вид(наверное тока мне).

Как то объединять у меня не получалось. Книжки читал, но как то не вдомек.Запутался в общем.

Вообще можно было присвоить A.Sys_Num=AD.Sys_Num какой нить виртуальной таблице а потом ее приравнять к ARCheck тогда б наверное то получилось.
Заранее спасибо.


 
unknown ©   (2006-02-17 22:21) [1]

Было бы понятнее, если бы предоставили исх. данные и требуемый рез-т.
На вскидку:
SELECT AR.* FROM ARcheck AR
left outer join ADCheck AD on AD.Sys_Num=AR.Sys_Num
left outer join acheck A on A.Sys_Num=AD.Sys_Num
WHERE A.LogicDate BETWEEN "01.01.2006" AND "24.01.2006" AND A.Sys_Num=AD.Sys_Num AND AD.Sifr = 15


 
Desdechado ©   (2006-02-17 22:29) [2]

> WHERE AR.SYS_NUM=(Select A.* , AD.*
И как это ты сравниваешь ОДНО поле с НАБОРОМ полей, который возвращает вложенный SELECT? И это "привычно все на вид"?!
И если вложенный SELECT может вернуть БОЛЬШЕ ОДНОЙ строки, то никаких сравнений, только проверка вхождения во множество WHERE AR.SYS_NUM IN( Select ...


 
ViktorZ ©   (2006-02-17 22:48) [3]

Спасибо.
И как это ты сравниваешь ОДНО поле с НАБОРОМ полей, который возвращает вложенный SELECT? И это "привычно все на вид"?!

Да я думал он их поочереди будет сравнивать а нужные выведет.


 
ViktorZ ©   (2006-02-18 08:58) [4]


> только проверка вхождения во множество WHERE AR.SYS_NUM
> IN( Select

Ага. И так хоть для скольки таблиц, то есть можно хоть 10 приравнять по полю.


 
Desdechado ©   (2006-02-18 15:14) [5]

> я думал он их поочереди будет сравнивать а нужные выведет
по очереди что? 20 полей из A и 15 из AD (ведь A.* - означает "все поля А")?
как ты себе представляешь при этом "нужные выведет"?

> IN( Select
> так хоть для скольки таблиц, то есть можно хоть 10 приравнять по полю
Еще раз - не приравнивание, а проверка вхождения во множество, полученное любой выборкой, но только тех полей, которые нужно проверять, а не всех подряд)


 
unknown ©   (2006-02-18 16:48) [6]

Честно говоря, не вижу в приведенном примере смысла во вложенном запросе.
Можно сделать и с join-ами, что логичнее.
Хотя, автор так и не представил примеры данных и желаемый результат.


 
ViktorZ ©   (2006-02-18 19:33) [7]


> Хотя, автор так и не представил примеры данных и желаемый
> результат.
>

Это не просто сделать, а Desdechado Знает о чем я. Я раньшне просто спрашивал.


 
ViktorZ ©   (2006-02-19 20:48) [8]

А как избавиться от ошибки"error creating cursor handle":
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Text :="DELETE FROM Categ15";
Query1.SQL.Text:="INSERT INTO Categ15 SELECT M.Sifr,M.Categ,M.Price FROM Menu M "+
" LEFT OUTER JOIN ARCheck AR on AR.Sifr=M.Sifr"+
" LEFT OUTER JOIN  ADCheck AD on AD.Sys_Num=AR.Sys_Num"+
" LEFT OUTER JOIN acheck A on A.Sys_Num=AD.Sys_Num  WHERE"+
" M.Categ=15 AND A.LogicDate BETWEEN :P1 AND :P2 AND A.Sys_Num=AD.Sys_Num AND AD.Sifr =:P3 GROUP BY M.Sifr,M.Categ,M.Price";
Query1.Params[0].AsDate := strtoDate(Trim( Edit1.text));
Query1.Params[1].AsDate := strtoDate(Trim( Edit2.text));
Query1.Params[2].Asinteger := strtoint(Trim( Edit3.text));
Query1.Open;

Сам понимаю что так теоретичеси нельзя. Но на практике канает. Но видимо там указатель в конце или что такое вот он и ругается. Как решить.


 
Desdechado ©   (2006-02-19 21:25) [9]

> "error creating cursor handle":
означает, что ты пытаешься получить набор данных от запроса, который не может его вернуть
Open для SELECT
ExecSQL для DELETE, UPDATE, INSERT и прочего

> Query1.SQL.Text :="DELETE FROM Categ15";
> Query1.SQL.Text:="INSERT INTO Categ15 SELECT M.Sifr,M.Categ,M.Price FROM
смысл этой записи?


 
ViktorZ ©   (2006-02-20 16:49) [10]

Нормальный смысл, главное работает. Этот запрос записывает в таблицу данные которые получил из SELECT. Просто мне нужно выполнить уловие IF. Типа если M.Categ=15 то просуммировать все поле Price. Если M.Categ<>15 то тоже суумирует, а потом от большего отнимает меньшее. Вот я так и делаю: 2кнопки. В одной считать пытаюсь, а потом в др. По другому пока не знаю как, вот и ищу др.методы.SUM(M.Price) AS TOTAL не помогает. Какую то лабуду выдает. А Делфи я немогу сделать так чтобы DBGrid отоброжал поле ТОТАЛ какже как и в SQL Explorer.


 
Рустем ©   (2006-02-20 17:17) [11]


>  как избавиться от ошибки"error creating cursor handle":

Еще раз внимательно прочитай [9], первую часть.


 
ViktorZ ©   (2006-02-20 20:17) [12]

Да я уже все сделал почти. Всем спасибо. Особенно Desdechado(как кстати у тя правильно ник читаеться?) и unknown.



Страницы: 1 вся ветка

Текущий архив: 2006.04.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.032 c
2-1143560637
Golik
2006-03-28 19:43
2006.04.16
Удалить запись.


4-1138459145
maxim161
2006-01-28 17:39
2006.04.16
Отправка сообщений процессу


4-1138348951
maxim161
2006-01-27 11:02
2006.04.16
Сервис и форма


1-1141989695
Александр Б.
2006-03-10 14:21
2006.04.16
Интерфейс, и потоки


15-1143304649
Mozart
2006-03-25 19:37
2006.04.16
Delphi и Linux