我有三个表,关系为 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
最佳答案
使用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
关于具有多个外连接的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39027922/