Главная страница
    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.049 c
15-1143423766
Fedia
2006-03-27 05:42
2006.04.16
Оформление описания структуры БД (или ГОСТ)


4-1138178994
maxim161
2006-01-25 11:49
2006.04.16
Shutdown&amp;DOS applications


15-1142018122
Костя
2006-03-10 22:15
2006.04.16
Архивация


2-1143606526
romychk
2006-03-29 08:28
2006.04.16
Аналог TQuery без BDE


2-1143553028
Чародей
2006-03-28 17:37
2006.04.16
Регистрация IP подключений





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский