Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有多个外部联接的SQL查询_Sql_Sql Server_Database_Oracle - Fatal编程技术网

具有多个外部联接的SQL查询

具有多个外部联接的SQL查询,sql,sql-server,database,oracle,Sql,Sql Server,Database,Oracle,我有三个关系为GradParent(Country)>Parent(State)>Child(People)的表。我正在尝试实现一个查询,以获得关于以下场景和按国家名称排序的不同信息。 1.所有人都有自己的州和国家的数据。 2.如果州内没有人员,则提供州和国家数据。 3.如果没有州和/或人,则只需国家数据 表: SQL: 选择不同的P1.ID作为国家/地区ID,P1.NAME作为国家/地区名称,P2.ID作为州/地区ID, P2.名称作为州名称,I1.ID作为人物ID,I1.Name作为人物名

我有三个关系为GradParent(Country)>Parent(State)>Child(People)的表。我正在尝试实现一个查询,以获得关于以下场景和按国家名称排序的不同信息。
1.所有人都有自己的州和国家的数据。
2.如果州内没有人员,则提供州和国家数据。
3.如果没有州和/或人,则只需国家数据

表:

SQL:

选择不同的P1.ID作为国家/地区ID,P1.NAME作为国家/地区名称,P2.ID作为州/地区ID,
P2.名称作为州名称,I1.ID作为人物ID,I1.Name作为人物名称
来自dbo.国家P1
内部连接dbo.State P2
在P2.Country_ID=P1.ID上
内部连接dbo.People I1
在I1.Country_ID=P1.ID上
按P1.NAME排序

使用
左外侧连接。即使没有匹配的子记录,它们也会将信息保留在父表中

此外,根据您的数据模型,您不应该需要
DISTINCT
关键字。毫无理由地把它扔进去是一种糟糕的做法

最后,您的
人员
的加入条件需要通过
STATE\u 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

尝试将您的
内部联接更改为
左联接
因为其他人已经发表了评论/回答,您需要(为没有州的国家和没有人的国家/州生成行)的是左(外部)联接,不管您的标题如何。我将对其进行编辑以反映这一点。然后,您的数据模型未规范化(这不好)。PEOPLE表应该只有state_id;每个州的国家都已经显示在state表中,在PEOPLE中重复这些关系充其量是多余的,充其量是矛盾的。我想这是一种家庭作业;我不喜欢你的老师,他们用这样的表教授坏习惯。还有-你的数据库产品是什么?你呢SQL Server和Oracle都有,这实际上是正确的(两者都有)在大约1%的情况下。挑剔…为什么别名
p1
用于
国家
p2
用于
i1
用于
?为什么不
c
用于
国家
s
用于
p
用于
,连接条件“i1.country_id=p1.id”是冗余的-只要
人员
国家
之间的状态正确匹配,并且
国家
国家
之间的国家正确匹配,
人员和
国家`将自动匹配(或者该表包含内部矛盾——这可能是糟糕的非正常设计的影响之一)。他没有发布表设计。我不想假设state_id是state表中的主键,我认为很可能是。至于表别名,我使用的是OP使用的。
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