Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Помогите с запросом ошибкa SQL0811N / 8 сообщений из 8, страница 1 из 1
09.04.2013, 13:49
    #38218737
segoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом ошибкa SQL0811N
Есть две таблицы 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)
...
Рейтинг: 0 / 0
09.04.2013, 14:01
    #38218767
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом ошибкa SQL0811N
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 - возможно не нужен)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
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;
 
...
Рейтинг: 0 / 0
09.04.2013, 14:11
    #38218790
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом ошибкa SQL0811N
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)

Ещё вариант:

Код: plsql
1.
2.
SELECT distinct tab1.ID FROM tab1
          where (exists select 1 from tab2 where tab2.article =  ta1.article);
...
Рейтинг: 0 / 0
09.04.2013, 14:13
    #38218801
segoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом ошибкa SQL0811N
medoed,

Не подхватывается индекс в tab2(article), мне не нужен уникальный ID. Я хочу, чтоб первым подзапрос выполнился (select DISTINCT tab2.article from tab2) он отсекает более 90% записей.
...
Рейтинг: 0 / 0
09.04.2013, 14:18
    #38218809
Помогите с запросом ошибкa SQL0811N
segoff,

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

SELECT tab1.ID
FROM tab1
WHERE tab1.article IN (select DISTINCT tab2.article from tab2)
...
Рейтинг: 0 / 0
09.04.2013, 14:30
    #38218835
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом ошибкa SQL0811N
segoffmedoed,

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

Создайте сессионку - запихайте туда select DISTINCT tab2.article from tab2 - накатите индекс на сессиоку, а потом заджойните , как вам надо tab1 c с сессионкой - я ж не знал что у Вас вторая таблица большая...
...
Рейтинг: 0 / 0
09.04.2013, 16:41
    #38219132
segoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом ошибкa SQL0811N
Евгений Хабаров,

Спасибо!
...
Рейтинг: 0 / 0
09.04.2013, 17:30
    #38219223
CawaSPb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом ошибкa SQL0811N
Евгений Хабаровsegoff,
Заменить во втором запросе знак равенства на IN не поможет? Или это нарушит логику запроса?

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

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



IMHO более читаемо:
Код: sql
1.
2.
3.
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
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Помогите с запросом ошибкa SQL0811N / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]