Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Деление реляций на SQL одним запросом 
:(
    Опции темы
Wiedzmin
Дата 14.10.2006, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 17.1.2006

Репутация: нет
Всего: нет



Есть например таблица 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 ).

Это сообщение отредактировал(а) Wiedzmin - 14.10.2006, 18:12
PM MAIL   Вверх
boevik
Дата 14.10.2006, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: 6
Всего: 35



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

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



--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
Wiedzmin
Дата 14.10.2006, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 17.1.2006

Репутация: нет
Всего: нет



Соответствие то есть, но не такое...

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

Это сообщение отредактировал(а) Wiedzmin - 14.10.2006, 19:50
PM MAIL   Вверх
ZeeLax
Дата 16.10.2006, 06:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 4388
Регистрация: 20.8.2006
Где: Алма-Ата

Репутация: нет
Всего: 88



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

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


--------------------
Utility is when you have one telephone, luxury is when you have two, opulence is when you have three — and paradise is when you have none.
— Doug Larson
PM MAIL WWW ICQ Skype Jabber   Вверх
Wiedzmin
Дата 16.10.2006, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 17.1.2006

Репутация: нет
Всего: нет



ZeeLax, самую простую структуру здесь написал (таблицы a, b, c), тот запрос про форумы это для примера, чтобы яснее общая задача была
PM MAIL   Вверх
Shiny
Дата 16.10.2006, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


разбойница
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 18.9.2006
Где: Киев

Репутация: нет
Всего: 6



Код

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


PM MAIL   Вверх
Wiedzmin
Дата 16.10.2006, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 17.1.2006

Репутация: нет
Всего: нет



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
PM MAIL   Вверх
Shiny
Дата 16.10.2006, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


разбойница
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 18.9.2006
Где: Киев

Репутация: нет
Всего: 6



А ты проверил???
Я уже сама усомнилась, специально новую базу создала, проверила - мой запрос работает абсолютно правильно
Мои результаты:
x    y
1    3
1    4
2    4
    
PM MAIL   Вверх
Wiedzmin
Дата 16.10.2006, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 17.1.2006

Репутация: нет
Всего: нет



Результат должен быть:

x
1
PM MAIL   Вверх
Shiny
Дата 17.10.2006, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


разбойница
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 18.9.2006
Где: Киев

Репутация: нет
Всего: 6



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

Это сообщение отредактировал(а) Shiny - 17.10.2006, 10:51
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0791 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.