SQL - 两个外连接

use*_*192 3 sql

我有一个代表国家/地区列表的表格。我有另一个代表状态列表的表。我有另一个代表省份列表的表格。由于数据定义不佳,有些州实际上在省表中,反之亦然。无论如何,每个省和州都与一个国家相关联。

我基本上需要做一个双左外连接。我的问题是,我该怎么做?这是我目前正在尝试的:

select
  c.Name as 'CountryName',
  ISNULL(p.[Name], '') as 'ProvinceName',
  ISNULL(s.[Name], '') as 'StateName'
from
  Country c 
    left outer join [Province] p on p.[CountryID]=c.[ID]
    left outer join [State] s on s.[CountryID]=c.[ID]
Run Code Online (Sandbox Code Playgroud)

请注意,我需要做一些与两个左外连接相当的事情。这是我正在尝试执行的查询的简化版本。感谢您的帮助!

cle*_*tus 5

你可以按照你说的方式去做。没有什么不对的。不过,我不一定会用空字符串替换 NULL。你有理由这样做吗?

在执行本质上是两个一对多连接时,您必须注意的是结果是乘法的。我的意思是,如果一个国家的省表中有 3 个条目,州表中有 4 个条目,您将返回该国家/地区的 12 行。

在这些情况下执行 UNION 可能更合适。例如:

SELECT
  c.Name AS 'CountryName',
  '' AS 'ProvinceName',
  ISNULL(s.[Name], '') AS 'StateName'
FROM Country c 
LEFT OUTER JOIN [Province] p ON p.[CountryID]=c.[ID]
UNION ALL
SELECT
  c.Name AS 'CountryName',
  ISNULL(p.[Name], '') AS 'ProvinceName',
  '' AS 'ProvinceName'
FROM Country c 
LEFT OUTER JOIN [State] s ON s.[CountryID]=c.[ID]
Run Code Online (Sandbox Code Playgroud)

作为一种可能性。这实际上取决于您的数据是什么样子以及您希望最终结果是什么。