具有多个外连接的SQL查询

时间:2016-08-18 21:39:33

标签: sql sql-server database oracle

我有三个关系表格为GradParent(国家)>父(州)>孩子(人)。我正在尝试实现一个查询,以获取有关以下方案的不同信息,并按国家/地区名称进行排序 1.所有人的国家和国家数据 2.如果国家没有人,那么州和国家数据 3.如果没有州和/或人,那么只有国家数据。

表: enter image description here

SQL:

SELECT DISTINCT P1.ID as COUNTRY_ID, P1.NAME AS COUNTRY_NAME, P2.ID AS STATE_ID, 
P2.Name AS STATE_NAME , I1.ID AS PEOPLE_ID, I1.NAME AS PEOPLE_NAME 
FROM dbo.Country P1
    INNER JOIN dbo.State P2
        ON P2.Country_ID = P1.ID
        INNER JOIN dbo.People I1
            ON I1.Country_ID = P1.ID

    <!-- WHERE P1.Name like 'USA%'--- optional-->
    ORDER BY P1.NAME

1 个答案:

答案 0 :(得分:1)

使用LEFT OUTER加入。即使没有匹配的子记录,这些也会将信息保留在父表中。

此外,根据您的数据模型,您不需要DISTINCT关键字。无缘无故地把它扔进去是一种不好的做法。

最后,PEOPLE的加入条件需要限制为STATE_ID

SELECT p1.id AS country_id,
       p1.name AS country_name,
       p2.id AS state_id,
       p2.name AS state_name,
       i1.id AS people_id,
       i1.name AS people_name
FROM   dbo.country p1
       LEFT JOIN dbo.state p2 ON p2.country_id = p1.id
       LEFT JOIN dbo.people i1 ON i1.country_id = p1.id AND i1.state_id = p2.id
-- WHERE P1.Name like 'USA%'--- optional--
ORDER BY p1.name, p2.name, i1.name