Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 Помогите с запросом ошибкa SQL0811N  [new]
segoff
Member

Откуда: Минск
Сообщений: 83
Есть две таблицы tab1 ,tab2
tab1 tab2
id article article .. .. .. ..
23 54546 68734
56 75554 45654
57 86766 85655

Необходимо получить ID для общих article. Первый запрос не подхватывает инндексы и в таблице 2 много сторок с одинаковыми article. Хотелось бы сперва сделать под запрос на уникальность а потом сравнение. Во втором запросе план доступа хороший, но получаю ошибку SQL0811N Результат скалярной полной выборки, оператора SELECT INTO или оператора VALUES INTO - больше одной строки таблицы. Как можно поправить SQL?



SELECT tab1.ID
FROM tab1, tab2
WHERE tab1.article = tab2.article

SELECT tab1.ID
FROM tab1
WHERE tab1.article = (select DISTINCT tab2.article from tab2)
9 апр 13, 13:49    [14156485]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом ошибкa SQL0811N  [new]
medoed
Member

Откуда:
Сообщений: 944
segoff
Есть две таблицы tab1 ,tab2
tab1 tab2
id article article .. .. .. ..
23 54546 68734
56 75554 45654
57 86766 85655

Необходимо получить ID для общих article. Первый запрос не подхватывает инндексы и в таблице 2 много сторок с одинаковыми article. Хотелось бы сперва сделать под запрос на уникальность а потом сравнение. Во втором запросе план доступа хороший, но получаю ошибку SQL0811N Результат скалярной полной выборки, оператора SELECT INTO или оператора VALUES INTO - больше одной строки таблицы. Как можно поправить SQL?



SELECT tab1.ID
FROM tab1, tab2
WHERE tab1.article = tab2.article

SELECT tab1.ID
FROM tab1
WHERE tab1.article = (select DISTINCT tab2.article from tab2)



Не проверял, но попробуйте( distinct - возможно не нужен)

SELECT distinct tab1.ID FROM tab1
          inner join tab2 on tab1.article =  tab2.article ;

with t2(article) as
(select DISTINCT article from tab2)
select distinct tab1.ID from tab1
WHERE tab1.article =  t2.article;
 
9 апр 13, 14:01    [14156562]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом ошибкa SQL0811N  [new]
medoed
Member

Откуда:
Сообщений: 944
segoff
Есть две таблицы tab1 ,tab2
tab1 tab2
id article article .. .. .. ..
23 54546 68734
56 75554 45654
57 86766 85655

Необходимо получить ID для общих article. Первый запрос не подхватывает инндексы и в таблице 2 много сторок с одинаковыми article. Хотелось бы сперва сделать под запрос на уникальность а потом сравнение. Во втором запросе план доступа хороший, но получаю ошибку SQL0811N Результат скалярной полной выборки, оператора SELECT INTO или оператора VALUES INTO - больше одной строки таблицы. Как можно поправить SQL?



SELECT tab1.ID
FROM tab1, tab2
WHERE tab1.article = tab2.article

SELECT tab1.ID
FROM tab1
WHERE tab1.article = (select DISTINCT tab2.article from tab2)


Ещё вариант:

SELECT distinct tab1.ID FROM tab1
          where (exists select 1 from tab2 where tab2.article =  ta1.article);
9 апр 13, 14:11    [14156618]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом ошибкa SQL0811N  [new]
segoff
Member

Откуда: Минск
Сообщений: 83
medoed,

Не подхватывается индекс в tab2(article), мне не нужен уникальный ID. Я хочу, чтоб первым подзапрос выполнился (select DISTINCT tab2.article from tab2) он отсекает более 90% записей.
9 апр 13, 14:13    [14156630]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом ошибкa SQL0811N  [new]
Евгений Хабаров
Member

Откуда: Москва
Сообщений: 773
segoff,

Заменить во втором запросе знак равенства на IN не поможет? Или это нарушит логику запроса?

SELECT tab1.ID
FROM tab1
WHERE tab1.article IN (select DISTINCT tab2.article from tab2)
9 апр 13, 14:18    [14156652]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом ошибкa SQL0811N  [new]
medoed
Member

Откуда:
Сообщений: 944
segoff
medoed,

Не подхватывается индекс в tab2(article), мне не нужен уникальный ID. Я хочу, чтоб первым подзапрос выполнился (select DISTINCT tab2.article from tab2) он отсекает более 90% записей.


Создайте сессионку - запихайте туда select DISTINCT tab2.article from tab2 - накатите индекс на сессиоку, а потом заджойните , как вам надо tab1 c с сессионкой - я ж не знал что у Вас вторая таблица большая...
9 апр 13, 14:30    [14156714]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом ошибкa SQL0811N  [new]
segoff
Member

Откуда: Минск
Сообщений: 83
Евгений Хабаров,

Спасибо!
9 апр 13, 16:41    [14157813]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом ошибкa SQL0811N  [new]
CawaSPb
Member

Откуда: Питер/Москва/Wroclaw
Сообщений: 1092
Евгений Хабаров
segoff,
Заменить во втором запросе знак равенства на IN не поможет? Или это нарушит логику запроса?

SELECT tab1.ID
FROM tab1
WHERE tab1.article IN (select DISTINCT tab2.article from tab2)


Это не просто не нарушит логику запроса, а исправит неверную логику.
Правильно исходный запрос должен бы выглядеть так:
SELECT tab1.ID
FROM tab1 t1
WHERE tab1.article = (select DISTINCT tab2.article from tab2 where tab2.article = t1.article)


IMHO более читаемо:
SELECT tab1.ID
FROM tab1 t1
WHERE  EXISTS (select 1 from tab2 where tab2.article = t1.article)


На тему, что использовать - посмотреть планы, реальное время выполнения.

Замечу, интересно почитать гугл на тему "IN vs EXISTS" или "NOT IN vs NOT EXISTS" (кстати, в общем случае они семантически неэквивалентны).

PS В ту же копилку:
ftp://ftp.software.ibm.com/software/dw/dm/db2/0208zubiri/0208zubiri.pdf
9 апр 13, 17:30    [14158187]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить