Операторы SQL "GROUP BY" и "INNER JOIN" вместе - PullRequest
0 голосов
/ 03 июня 2018

У меня есть две таблицы ЖИВОТНЫХ и НЕОБХОДИМОСТИ:

        ANIMAL                                      NEED        
Name    Species         Birthday                A_Species      Type 
Koala1  Phascolarctidae 02-10-2014           Phascolarctidae    Veg.    
Bear1   Ursinae         03-10-2016           Ursinae            Veg.    
Koala2  Phascolarctidae 04-09-2015           Ursinae            Meet    
Cattle1 Bovidae         20.03.2017           Ursinae            Fish    
Whale1  Cetacea         08.05.2010           Bovidae            Veg.    
                                             Cetacea            Fish    

Я хотел бы выбрать следующую таблицу

    Name    Type                
    Koala1  Veg.                
    Koala2  Veg.                
    Cattle1 Veg.                
    Whale1  Fish                

, которая представляет собой список названий животных и их пищи, которыенужен только один тип пищи!

Я должен объединить два утверждения

SELECT A_Species 
FROM NEED GROUP BY A_Species
HAVING COUNT(A_Species)=1;

и

SELECT ANIMAL.NAME, NEED.Type 
FROM ANIMAL 
INNER JOIN NEED ON ANIMAL.Species = NEED.A_Species;                 

Я пытался

SELECT ANIMAL.NAME, NEED.Type 
FROM ANIMAL 
INNER JOIN NEED ON ANIMAL.Species = NEED.A_Species 
WHERE EXISTS(SELECT A_Species 
FROM NEED GROUP BY A_Species
HAVING COUNT(A_Species)=1); 

который не работает!Вы можете помочь мне, как я могу собрать их вместе?

1 Ответ

0 голосов
/ 03 июня 2018

Один метод использует агрегацию:

SELECT a.NAME, MAX(n.Type)
FROM ANIMAL a INNER JOIN
     NEED n
     ON a.SPECIES = n.A_SPECIES 
GROUP BY a.Name
HAVING COUNT(*) = 1;

Или альтернативный вариант использования NOT EXISTS:

SELECT a.NAME, n.Type
FROM ANIMAL a INNER JOIN
     NEED n
     ON a.SPECIES = n.A_SPECIES 
WHERE NOT EXISTS (SELECT 1
                  FROM need n2
                  WHERE n2.A_SPECIES = n.A_SPECIES AND
                        n2.Type <> n.Type
                 );

На практике это, вероятно, имеет лучшую производительность, особенно с индексом на need(a_species, type).

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