Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с вложенным запросом  [new]
2furious
Member

Откуда:
Сообщений: 19
select *
from table1
where (debacc , credacc , summa , date, number, deban, credan) in
(select debacc , credacc , summa , date, number, deban, credan
from table1
group by debacc, credacc, summa, date, number,deban , deban
having count (summa)>2)

Ругается на это. Как вытащить несколько полей из вложенного запроса??

В некоорых пробовал возвращать сумму полей, но здесь не может перевести строку в число. что делать? :(
26 июн 09, 11:40    [7346911]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с вложенным запросом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Есть подзапросы exists()
26 июн 09, 11:49    [7346969]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с вложенным запросом  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
select *
from table1  as t1
join (select debacc , credacc , summa , date, number, deban, credan
        from table1
       group by debacc, credacc, summa, date, number,deban , deban
      having count (summa)>2
     ) as t2 on t2.debacc debacc 
            and t2.credacc = t1.credacc 
            and t2.summa = t1.summa
            and t2.date = t1.date
            and t2.number = t1.number
            and t2.deban = t1.deban
            and t2.credan = t1.credan
ЗЫ не проверял
26 июн 09, 11:49    [7346974]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с вложенным запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
SQL2005/2008
select * 
from table1
where not exists(select debacc , credacc , summa , date, number, deban, credan
except select debacc , credacc , summa , date, number, deban, credan from table1)
group by debacc, credacc, summa, date, number,deban , deban
having count (summa)>2)
Паганель
ЗЫ не проверял
Аналогично.
26 июн 09, 12:09    [7347113]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с вложенным запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Скобка лишняя затесалась
iap
SQL2005/2008
select * 
from table1
where not exists(select debacc , credacc , summa , date, number, deban, credan
except select debacc , credacc , summa , date, number, deban, credan from table1
group by debacc, credacc, summa, date, number,deban , deban
having count (summa)>2)
Паганель
ЗЫ не проверял
Аналогично.
26 июн 09, 12:12    [7347137]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с вложенным запросом  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
iap,
насколько я понял, автор хочет, чтобы его запрос выдал строки-дубликаты,
(но дубликатом у него считается пара строк, в которой не все поля попарно равны,
а только опр. перечень полей)

А Ваш запрос вроде решает какую-то другую задачу
Во всяком случае, я не могу разглядеть связь того, что внутри скобок после exists
с тем, что снаружи этих скобок
26 июн 09, 12:16    [7347178]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с вложенным запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Если в полях нет NULLов, то можно и так:
select * 
from table1 t
where (select count(tt.summa)
from table1 tt
where tt.debacc=t.debacc and tt.credacc=t.credacc and tt.summa=t.summa and tt.date=t.date and tt.number=t.number and tt.deban=t.deban and tt.credan=t.credan)>2;
26 июн 09, 12:17    [7347185]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с вложенным запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Паганель
iap,
насколько я понял, автор хочет, чтобы его запрос выдал строки-дубликаты,
(но дубликатом у него считается пара строк, в которой не все поля попарно равны,
а только опр. перечень полей)

А Ваш запрос вроде решает какую-то другую задачу
Во всяком случае, я не могу разглядеть связь того, что внутри скобок после exists
с тем, что снаружи этих скобок
Первый SELECT в EXCEPT - это поля внешнего запроса "текущей" строки.
Если в таблице есть такой же набор этих колонок в количестве больше двух (кстати, это уже "затроение" получается), то EXCEPT не вернёт ни одной строки для текущей строки внешнего запроса.
Весь фокус в том, что первый SELECT EXCEPTа - без FROM, а второй "по-честному" делает новую выборку из таблицы (FROM есть)
26 июн 09, 12:22    [7347219]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с вложенным запросом  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
а, точно, там from-а нету
прикольно, а я и не заметил
26 июн 09, 12:23    [7347232]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с вложенным запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
Весь фокус в том, что первый SELECT EXCEPTа - без FROM, а второй "по-честному" делает новую выборку из таблицы (FROM есть)
Кстати, такой способ предполагает равенство двух NULLов разных строк.
Другими способами добиться такого же эффекта сложнее - скорее всего придётся писать дополнительную обработку NULLов

Для 2000-го можно написать похожий запрос с UNION (без ALL) вместо EXCEPT.
Но тогда придётся считать COUNT(*) строк подзапроса, а это, должен заметить,
будет заметно менее эффективно.

Можно ещё так:
select * 
from table1 t
where exists(select *
from table1 tt
where tt.debacc=t.debacc and tt.credacc=t.credacc and tt.summa=t.summa and tt.date=t.date and tt.number=t.number and tt.deban=t.deban and tt.credan=t.credan
group by tt.debacc, tt.credacc, tt.summa, tt.date, tt.number, tt.deban, tt.credan
having count(summa)>2);
26 июн 09, 12:32    [7347303]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с вложенным запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
Можно ещё так:
select * 
from table1 t
where exists(select *
from table1 tt
where tt.debacc=t.debacc and tt.credacc=t.credacc and tt.summa=t.summa and tt.date=t.date and tt.number=t.number and tt.deban=t.deban and tt.credan=t.credan
group by tt.debacc, tt.credacc, tt.summa, tt.date, tt.number, tt.deban, tt.credan
having count(summa)>2);
Похоже, group by лишний
select * 
from table1 t
where exists(select *
from table1 tt
where tt.debacc=t.debacc and tt.credacc=t.credacc and tt.summa=t.summa and tt.date=t.date and tt.number=t.number and tt.deban=t.deban and tt.credan=t.credan
having count(summa)>2);
26 июн 09, 12:40    [7347369]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с вложенным запросом  [new]
2furious
Member

Откуда:
Сообщений: 19
iap,

Похоже мой комп его сеня не осилит. уже час как процессит.
26 июн 09, 15:05    [7348564]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с вложенным запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
2furious
iap,

Похоже мой комп его сеня не осилит. уже час как процессит.
"Его" - это кого?
26 июн 09, 15:12    [7348613]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с вложенным запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
2furious
iap,

Похоже мой комп его сеня не осилит. уже час как процессит.
"Его" - это кого?
И Паганель тоже решение предлагал...
26 июн 09, 15:42    [7348846]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с вложенным запросом  [new]
2furious
Member

Откуда:
Сообщений: 19
iap,

"Его" -твой последний запрос. Паганеля что-то неправильно выдает - больше, чем ожидается.
26 июн 09, 15:58    [7349015]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с вложенным запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
2furious
iap,

"Его" -твой последний запрос. Паганеля что-то неправильно выдает - больше, чем ожидается.
А сколько записей в таблице и какие созданы индексы?
Хорошо бы здесь CREATE TABLE написать и CREATE INDEX.
Что показывает план выполнения?

Версия сервера - ...?
26 июн 09, 16:01    [7349040]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с вложенным запросом  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
2furious
Паганеля что-то неправильно выдает - больше, чем ожидается.
Ну так посмотрите на "лишние", по Вашему мнению, строки результата
и попытайтесь изменить условия выборки так, чтобы они не появлялись
Ато мне отсюда не видно, какие конкретно данные "лишние"
26 июн 09, 16:03    [7349058]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить