[英]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.