Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.05 c
2-1143644448
Fl@sh
2006-03-29 19:00
2006.04.16
TMemoryStream TidTCPClient..server


15-1143099827
Der Nechk@ssoff
2006-03-23 10:43
2006.04.16
Windows Vista


15-1143094094
__DATA__
2006-03-23 09:08
2006.04.16
Очистить Desktop после рисования на нем


2-1143717391
sanich
2006-03-30 15:16
2006.04.16
Cross-отеты в Fast Report


2-1143798714
KyRo
2006-03-31 13:51
2006.04.16
Операции с датой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский