Форум: "Базы";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];
ВнизКак сделать запрос к результату запроса. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.049 c