![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать запрос к результату запроса. [D7, dBase, FoxPro]
ViktorZ © (2006-02-17 22:14:00)Как применить к результату запроса еще одно условие.
Есть запрос вида:
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 тогда б наверное то получилось.
Заранее спасибо.
ViktorZ (2006-02-20 20:17:00) [1]Да я уже все сделал почти. Всем спасибо. Особенно Desdechado(как кстати у тя правильно ник читаеться?) и unknown.
Рустем (2006-02-20 17:17:00) [2]
> как избавиться от ошибки"error creating cursor handle":
Еще раз внимательно прочитай [9], первую часть.
ViktorZ (2006-02-20 16:49:00) [3]Нормальный смысл, главное работает. Этот запрос записывает в таблицу данные которые получил из SELECT. Просто мне нужно выполнить уловие IF. Типа если M.Categ=15 то просуммировать все поле Price. Если M.Categ<>15 то тоже суумирует, а потом от большего отнимает меньшее. Вот я так и делаю: 2кнопки. В одной считать пытаюсь, а потом в др. По другому пока не знаю как, вот и ищу др.методы.SUM(M.Price) AS TOTAL не помогает. Какую то лабуду выдает. А Делфи я немогу сделать так чтобы DBGrid отоброжал поле ТОТАЛ какже как и в SQL Explorer.
Desdechado (2006-02-19 21:25:00) [4]> "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-19 20:48:00) [5]А как избавиться от ошибки"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;
Сам понимаю что так теоретичеси нельзя. Но на практике канает. Но видимо там указатель в конце или что такое вот он и ругается. Как решить.
ViktorZ (2006-02-18 19:33:00) [6]
> Хотя, автор так и не представил примеры данных и желаемый
> результат.
>
Это не просто сделать, а Desdechado Знает о чем я. Я раньшне просто спрашивал.
unknown (2006-02-18 16:48:00) [7]Честно говоря, не вижу в приведенном примере смысла во вложенном запросе.
Можно сделать и с join-ами, что логичнее.
Хотя, автор так и не представил примеры данных и желаемый результат.
Desdechado (2006-02-18 15:14:00) [8]> я думал он их поочереди будет сравнивать а нужные выведет
по очереди что? 20 полей из A и 15 из AD (ведь A.* - означает "все поля А")?
как ты себе представляешь при этом "нужные выведет"?
> IN( Select
> так хоть для скольки таблиц, то есть можно хоть 10 приравнять по полю
Еще раз - не приравнивание, а проверка вхождения во множество, полученное любой выборкой, но только тех полей, которые нужно проверять, а не всех подряд)
ViktorZ (2006-02-18 08:58:00) [9]
> только проверка вхождения во множество WHERE AR.SYS_NUM
> IN( Select
Ага. И так хоть для скольки таблиц, то есть можно хоть 10 приравнять по полю.
ViktorZ (2006-02-17 22:48:00) [10]Спасибо.
И как это ты сравниваешь ОДНО поле с НАБОРОМ полей, который возвращает вложенный SELECT? И это "привычно все на вид"?!
Да я думал он их поочереди будет сравнивать а нужные выведет.
Desdechado (2006-02-17 22:29:00) [11]> WHERE AR.SYS_NUM=(Select A.* , AD.*
И как это ты сравниваешь ОДНО поле с НАБОРОМ полей, который возвращает вложенный SELECT? И это "привычно все на вид"?!
И если вложенный SELECT может вернуть БОЛЬШЕ ОДНОЙ строки, то никаких сравнений, только проверка вхождения во множество WHERE AR.SYS_NUM IN( Select ...
unknown (2006-02-17 22:21:00) [12]Было бы понятнее, если бы предоставили исх. данные и требуемый рез-т.
На вскидку:
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