найти повторяющиеся записи в связанных таблицах

Рассмотрим следующую структуру данных:

parking garages
    |
    |_ garage 1
        |__ red car
        |__ blue car
    |_ garage 2
        |__ yellow car
        |__ orange car
    |_ garage 3
        |__ red car
        |__ red car
        |__ yellow car

«Парковочные гаражи» — это таблица, и каждая запись является внешним ключом к таблице «garageCars», содержащей одну запись для каждого автомобиля в гараже.

Что я хотел бы сделать, так это написать запрос, который вернул бы «гараж 3», потому что в нем есть 2 красные машины.

Я пытался использовать предложение HAVING со счетчиком, но это возвращает все строки, в которых есть более 1 автомобиля. Мне нужно что-то большее в духе «ГДЕ количество (автомобиль) > 1 и car.color = car.color».


person dmarra    schedule 07.11.2011    source источник
comment
выберите автомобиль, подсчитайте (*) из группы «Гараж» по машине, чтобы получить количество автомобилей в гараже. какова структура вашей таблицы? два стола Гараж и Автомобиль?   -  person user194076    schedule 07.11.2011
comment
да, это два стола. машина и гараж.   -  person dmarra    schedule 08.11.2011


Ответы (1)


Предполагая, что вам нужно только название гаража, а не цвет, который был обманут, потому что вы хотите «... запрос, который вернет «гараж 3», потому что в нем 2 красные машины»

Использование производной таблицы

SELECT g.garagename 
FROM   garage g 
       INNER JOIN (SELECT garage_id 
                   FROM   cars 
                   GROUP  BY garage_id, 
                             carcolor 
                   HAVING COUNT(garage_id) > 1) c 
         ON g.garage_id = c.garage_id 

Использование входа

SELECT g.garagename 
FROM   garage g 
WHERE  g.garage_id IN (SELECT garage_id 
                       FROM   cars 
                       GROUP  BY garage_id, 
                                 carcolor 
                       HAVING COUNT(garage_id) > 1) 

Вы также можете сделать это с помощью EXISTS, CROSS APPLY или CTE.

person Conrad Frix    schedule 07.11.2011
comment
версия IN работала как шарм! Я не пробовал производную табличную версию, так как IN-версия сработала. СПАСИБО! - person dmarra; 08.11.2011