Разделение SQL - PullRequest
       20

Разделение SQL

0 голосов
/ 10 июня 2009

у меня три таблицы; Квартира (apartmentnr, этаж, тип квартиры), Этаж (этаж, дом), Дом (дом, адрес)

Теперь я хочу показать housenr и адреса домов, в которых есть квартиры всех типов квартир (1-4), используя «НЕ СУЩЕСТВУЕТ».

Пожалуйста, помогите мне с предложениями о том, как это сделать!

Ответы [ 4 ]

3 голосов
/ 10 июня 2009

Как подсказывает @onedaywhen, not exists довольно трудоемок для этой задачи, а count distinct предлагает более тонкий синтаксис (проблемы производительности упоминаются в статье, на которую он указывает):

SELECT House.adress
FROM House
JOIN Floor ON (House.housenr=Floor.house)
JOIN Apartment ON (Floor.floornr=Apartment.floor)
GROUP BY House.housenr
HAVING COUNT(DISTINCT Apartment.apartmenttype)=4

, что в сущности гласит: «показать адрес [[sic]] домов с 4 различными типами квартир». * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Не только не гадание;

1 голос
/ 10 июня 2009

Ах, тогда вы хотите использовать подход Криса Дейтса, а не тот, который сделал Джо Селко популярным? Если вы не уверены, оба подхода обсуждаются здесь:

Реляционное деление по Джо Селко

0 голосов
/ 10 июня 2009

Учитывая такую ​​структуру:

Дома

ID Адрес

Полы

ID HouseID

Квартиры

Id FloorId ApartmentType

Я думаю, что это поможет:

SELECT H.ID FROM Houses H JOIN Floors F ON H.Id = F.HouseId JOIN Apartments A on F.Id = A.FloorId AND A.ApartmentType = 1 AND H.Id IN 
(SELECT H.ID FROM Houses H JOIN Floors F ON H.Id = F.HouseId JOIN Apartments A on F.Id = A.FloorId AND A.ApartmentType = 2) AND H.Id IN 
(SELECT H.ID FROM Houses H JOIN Floors F ON H.Id = F.HouseId JOIN Apartments A on F.Id = A.FloorId AND A.ApartmentType = 3) AND H.Id IN 
(SELECT H.ID FROM Houses H JOIN Floors F ON H.Id = F.HouseId JOIN Apartments A on F.Id = A.FloorId AND A.ApartmentType = 4)

По-английски это означает, что дайте мне набор всех домов с квартирой типа 1, которые также находятся в наборе домов с квартирой типа 2 ... и так далее.

0 голосов
/ 10 июня 2009

Если я правильно понимаю ваши отношения, вы могли бы что-то вроде этого. Помните, что вы можете использовать псевдонимы для таблиц, чтобы их было легче читать, я просто оставил их, чтобы было понятно, что я делаю.

Select  House.hoursenr, address
inner join Floor on House.housenr = Floor.house
inner join Apartment on Apartment.floor = Floor.floornr
where Apartment.apartmenttype in (1,2,3,4)

Я бы сказал, что некоторые из ваших отношений сущностей неверны в определениях вашей таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...