【问题标题】:SQL query with multiple outer joins具有多个外连接的 SQL 查询
【发布时间】:2016-08-18 21:39:33
【问题描述】:

我有三个关系为 GradParent ( Country ) > Parent ( State ) > Child ( People ) 的表。我正在尝试实现查询以获取有关以下场景的不同信息并按国家/地区名称排序。
1. 所有人员数据及其所在州和国家/地区。
2. 如果州没有人,那么州和国家数据。
3. 如果没有州和/或人,那么只有国家数据。

表:

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

【问题讨论】:

  • 尝试将您的INNER JOINs 更改为LEFT JOINs
  • 正如其他人已经评论/回答的那样,您需要什么(为没有州的国家和没有人的国家/州生成行,尽管您的标题是左(外部)联接。我将对其进行编辑以反映这一点。然后,您的数据模型没有标准化(这不好)。PEOPLE 表应该只有 state_id;每个州的国家/地区已经显示在 STATE 表中,并在 PEOPLE 中重复这些关系充其量是多余的,最坏的情况是矛盾的。我认为这是某种家庭作业;我不喜欢你的老师,他们用这种桌子教坏习惯。
  • 另外 - 你的数据库产品是什么?您同时拥有 SQL Server 和 Oracle,实际上只有大约 1% 的情况是正确的(同时拥有两者)。

标签: sql sql-server database oracle


【解决方案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

【讨论】:

  • Nitpick... 为什么别名 p1 代表 countryp2 代表 statei1 代表 people?为什么不将c 用于countrys 用于statep 用于people? :-) 此外,连接条件 'i1.country_id = p1.id' 是多余的 - 只要状态在 peoplestate 之间正确匹配,并且国家/地区在 state 和 @987654341 之间正确匹配@、people and country` 将自动匹配(否则该表包含内部矛盾 - 不良、非正常设计的可能影响之一)。
  • 他没有发布表格设计。我不想假设 state_id 是 State 表中的主键,我认为它很可能是。至于表别名,我使用了 OP 使用的。
猜你喜欢
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 2019-01-15
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多