我有三个关系表格为GradParent(国家)>父(州)>孩子(人)。我正在尝试实现一个查询,以获取有关以下方案的不同信息,并按国家/地区名称进行排序 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
答案 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