【发布时间】: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