繁体   English   中英

SQL“GROUP BY”和“INNER JOIN”声明在一起

[英]SQL “GROUP BY” and “INNER JOIN” Statements together

我有两张ANIMAL和NEED表:

        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); 

哪个不行! 你能帮帮我怎么把它们放在一起?

一种方法使用聚合:

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)索引need(a_species, type)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM