Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / select bez sub-selectov .. / 8 сообщений из 8, страница 1 из 1
18.04.2002, 13:23
    #32028219
danik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select bez sub-selectov ..
vot u menja takoj problem.. nado sdelatj analogichnij zapros ne ispolzuja sub-select

dve tablicy

doc
---------
DOCID DESCR
1 data1
2 data2
3 data3
4 data4
---------
IDDOC - unikaljno

kword
----------
DOCID KEYWORD
1 aa
1 bb
1 cc
2 aa
2 bb
2 cc
3 xx
.........
---------
para (IDDOC - keyword) - unikaljna

Надо показать все doc.IDDOC для которых присутствует в таблице kword ВСЕ 3поля keyword со значением 'aa' 'bb' 'cc'
вот как я это сделал

SELECT d.DOCID, d.DESCR FROM doc AS d
WHERE EXISTS( SELECT * FROM kword AS k WHERE k.IDDOC=d.IDDOC and k.keyword='aa')
AND EXISTS( SELECT * FROM kword AS k WHERE k.IDDOC=d.IDDOC and k.keyword='bb')
AND EXISTS( SELECT * FROM kword AS k WHERE k.IDDOC=d.IDDOC and k.keyword='сс');

а нужно сделать БЕЗ вложенных селектов и обязательно начинать вот так

select d.DOCID, d.DOCNAME
from doc d, kword k
where d.DOCID = k.DOCID

Помогите пожалста.
...
Рейтинг: 0 / 0
18.04.2002, 13:46
    #32028224
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select bez sub-selectov ..
Попробуй так:

select d.DOCID, d.DOCNAME
from doc d, kword k
where d.DOCID = k.DOCID AND k.keyword IN ('aa','bb','сс')
...
Рейтинг: 0 / 0
18.04.2002, 14:03
    #32028229
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select bez sub-selectov ..
Извиняюсь, забыл добавить самое главное

select d.DOCID, MAX(d.DOCNAME) as DOCNAME
from doc d, kword k
where d.DOCID = k.DOCID AND k.keyword IN ('aa','bb','сс')
GROUP BY d.DOCID HAVING COUNT(*)=3

Правда это сработает, только если пара k.DOCID - k.keyword действительно уникальна
...
Рейтинг: 0 / 0
18.04.2002, 14:26
    #32028230
danik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select bez sub-selectov ..
что то не работает ...

тем более нельзя MAX(...) ставить
...
Рейтинг: 0 / 0
18.04.2002, 14:41
    #32028233
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select bez sub-selectov ..
Странно... У меня MS SQL 7 и такая конструкция прекрасно работает.

А MAX() ставить необходимо, поскольку при использовании GROUP BY недопустимо указывать просто имя поля без функций аггрегирования, если эти поля не являются полями по которым идет группировка.

Кроме того, я предполагаю, что для одного и того же значения DOCID значение DOCNAME должны быть одинаковыми, т.е. MAX() ничему не помешает.

А что собственно не работает? Или какими словами ругается?
...
Рейтинг: 0 / 0
18.04.2002, 14:45
    #32028234
danik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select bez sub-selectov ..
пустой респонс ответ ..ошибок то нету
кстати этот запрос надо в ANSI писать...а тестировал я на Accesse


может какой другой вариант существует ? ... башка скоро треснет
...
Рейтинг: 0 / 0
18.04.2002, 15:00
    #32028236
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select bez sub-selectov ..
Можно, только без вложенных запросов - вряд ли.

Кстати, может диалект Access отличается от стандартного. Кажется там вообще нельзя писать поля без функций аггрегирования если стоит GROUP BY. Т.е. поставь MAX() ко всем полям. На результат это не должно повлиять.


(!) Кажется понял в чем может быть ошибка.

Сравнение символьных строк осуществляется по полной строке? Т.е. что вернет сравнение:

'aa '='aa'

Может в выражении списка IN надо добить каждое выражение справа нужным количеством пробелов? Или написать в лоб:

where d.DOCID = k.DOCID AND (k.keyword='aa ' OR k.keyword='bb ' OR k.keyword='сс ')
...
Рейтинг: 0 / 0
18.04.2002, 17:45
    #32028248
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select bez sub-selectov ..
select d.DOCID, d.DOCNAME
from doc d
inner join kword k1 on d.DOCID=k1.DOCID
inner join kword k2 on d.DOCID=k2.DOCID
inner join kword k3 on d.DOCID=k3.DOCID
where
K1.KEYWORD='aa' and
K2.KEYWORD='bb' and
K3.KEYWORD='cc'
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / select bez sub-selectov .. / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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