Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > Деление реляций на SQL одним запросом


Автор: Wiedzmin 14.10.2006, 18:09
Есть например таблица a с полем x, таблица b с полем y и связывающая таблица c с полями x и y. Как найти такие x из a, которые в c имеют все соответствия y из b?

Двумя запросами можно сделать, например, так:
1. Такие x, пары x и y которых нет в таблице c: 
Код

CREATE TABLE R SELECT a.x FROM a, b LEFT JOIN c ON (a.x=c.x and b.y=c.y) WHERE c.x IS NULL

2. Такие x из a, у которых нету недостающих пар (которые записаны в R)
Код

SELECT distinct(a.x) FROM a LEFT JOIN R ON (R.x=a.x) WHERE R.x IS NULL


Одним запросом пробовал так (сначала выбираем как в первом из предыдущего, затем правым присоединением фильтруем те, что нужны)
Код

SELECT distinct(R.x) FROM a, b LEFT JOIN c ON (a.x=c.x and b.y=c.y) RIGHT JOIN a R ON (R.x=a.x and c.x IS NULL) WHERE a.x IS NULL


Но не получилось... Вообще что происходит тогда при этом запросе?

Просьба вложенными запросами не предлагать ), хочется реализовать джойнами с условиями IS NULL ).

Автор: boevik 14.10.2006, 18:22
Простой INNER JOIN между тремя таблицами не подойдет?
Почучишь все записи у которых есть соотвествие во всех таблицах
Код

SELECT *
FROM a INNER JOIN c ON a.x = c.x
INNER JOIN b ON c.y = b.y

Автор: Wiedzmin 14.10.2006, 19:45
Соответствие то есть, но не такое...

Например, надо найти таких пользователей, которые постили во всех форумах (т.е. если не нашлось поста хоть в одном форуме такой юзер не катит). Не сделаешь же это просто двумя INNER JOIN...

Автор: ZeeLax 16.10.2006, 06:45
Цитата(Wiedzmin @  14.10.2006,  22:45 Найти цитируемый пост)
Например, надо найти таких пользователей, которые постили во всех форумах (т.е. если не нашлось поста хоть в одном форуме такой юзер не катит). Не сделаешь же это просто двумя INNER JOIN...

Киньте структурку, пожалуйста.

Автор: Wiedzmin 16.10.2006, 13:30
ZeeLax, самую простую структуру здесь написал (таблицы a, b, c), тот запрос про форумы это для примера, чтобы яснее общая задача была

Автор: Shiny 16.10.2006, 14:27
Код

SELECT     a.x, b.y
FROM  c INNER JOIN b ON c.y = b.y RIGHT OUTER JOIN a ON c.x = a.x


Автор: Wiedzmin 16.10.2006, 16:13
Shiny, например a такая:
х
1
2

b:
y
3
4

c
x y
1 3
1 4
2 4

С запросом который мы ищем должен быть рядок со значением "1" (2 здесь не подходит, так как в таблице с нету строки x=2,y=3).

А запрос указаный тобой выводит
x y
1 3
1 4
1 NULL
2 NULL
2 NULL
2 4

Автор: Shiny 16.10.2006, 17:56
А ты проверил???
Я уже сама усомнилась, специально новую базу создала, проверила - мой запрос работает абсолютно правильно
Мои результаты:
x    y
1    3
1    4
2    4
    

Автор: Wiedzmin 16.10.2006, 18:06
Результат должен быть:

x
1

Автор: Shiny 17.10.2006, 10:01
Извини, не поняла задачу - мой провтык.
Немножко освобожусь - попробую поиграться с нужным запросом.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)