2017-10-18 36 views
1
NULL记录

我简单的数据库与3个表:如何显示在SQL

Galaxy(GalaxyID INTEGER PRIMARY KEY, Name TEXT); 

Planet(PlanetID INTEGER PRIMARY KEY, GalaxyID INTEGER, Name TEXT, Population INTEGER); 

Continent(ContinentID INTEGER PRIMARY KEY, PlanetID INTEGER,Name TEXT); 

INSERT INTO Galaxy VALUES 
(1, "MILKY WAY"), 
(2, "IC 1101"), 
(3, "GN-z11"); 

INSERT INTO Planet VALUES 
(1,1, "Earth", 100000), 
(2,1, "Moon", 0), 
(3,1, "Saturn", 0), 
(4,2, "IC-123", 0), 
(5,2, "IC-124", 1), 
(6,2, "IC-126", 4), 
(7,3, "GN-24", 1), 
(8,3, "GN-26", 1), 
(9,3, "GN-28", 4); 

INSERT INTO Continent VALUES 
(1,1, "Europe"), 
(2,4, "UnnamedContinent1"), 
(3,4, "UnnamedContinent2"); 

我想选择银河其不具有大陆的一切:

SELECT Galaxy.Name, Planet.name 
FROM Galaxy 
LEFT OUTER JOIN Planet, Continent 
ON Continent.PlanetID = Planet.PlanetID AND Galaxy.GalaxyID = Planet.GalaxyID 
GROUP BY Galaxy.Name 
HAVING COUNT(ContinentID) IS NULL 

此查询不会工作,但如果如果显示NULL记录,例如:GN-z11 NULL

+0

'COUNT(列)'不会'NULL'回报,否则就当列中只有'NULL'的记录时返回0。您可以使用where条件来实现您的目标:'WHERE NOT EXISTS(SELECT * FROM Continent WHERE Planet.PlanetID = Continent.PlanetID)' – Pred

回答

1

不需要(不需要)不需要COUNT,也不having,也不group by,只需添加额外的左连接与continent表:

SELECT DISTINCT g.Name GalaxyName, p.name PlanetName 
FROM Galaxy AS g 
LEFT JOIN Planet AS p ON g.GalaxyID = p.GalaxyID 
LEFT JOIN Continent AS c ON c.PlanetID = p.PlanetID 
WHERE c.PlanetID IS NULL; 

Demo

+0

感谢您的回复!但结果是银河与星球没有大陆,我想在所有行星有一个没有大陆的银河 – Kuba

0

首先,COUNT()永远不会返回NULL。如果没有匹配的行,它将返回0

其次,不要在FROM子句中使用逗号。始终使用明确的JOIN语法。

然后表别名使查询更容易编写和读取。

最后,你只需要一个WHERE条款并没有聚集:

SELECT g.Name 
FROM Galaxy g LEFT JOIN 
    Planet p 
    USING (GalaxyID) LEFT JOIN 
    Continent c 
    USING (PlanetID) 
WHERE c.PlanetId IS NULL; 

现在,这看起来就像是做正确的事。然而,一个星系将被列入没有大陆的每一颗行星。快速修复的问题是使用SELECT DISTINCT而不是SELECT

更好的整体方法是使用NOT EXISTS

SELECT g.* 
FROM Galaxy g 
WHERE NOT EXISTS (SELECT 1 
        FROM Planet p JOIN 
         Continent c 
         USING (PlanetID) 
        WHERE p.GalaxyID = g.GalaxyID 
       ); 
+0

你好!是的,你的权利银河系列将被列入没有大陆的所有行星,并且选择不一定不会修复它。我尝试了NOT EXISTS方法,但它也不能很好地工作 – Kuba

0

我想你可以试试这个方法:

SELECT Galaxy.Name, Planet.name 
FROM Galaxy 
LEFT join Planet P ON Galaxy.GalaxyID = Planet.GalaxyID 
where not exists 
    (select * 
    from Continent as C 
    where C.PlanetID=P.PlanetID)