Sql查询:如何正确使用右外部联接
我得去登记和定价Sql查询:如何正确使用右外部联接,sql,sql-server,left-join,right-join,Sql,Sql Server,Left Join,Right Join,我得去登记和定价 CREATE TABLE [dbo].[Register]( [RegisterID] [int] NULL, [GroupID] [int] NULL, [TestID] [int] NULL) CREATE TABLE [dbo].[Price]( [ID] [int] NULL, [GroupID] [int] NULL, [Price] [bigint] NULL, [Status] [bit] NULL) 假设与上面的图像类似的信息,请考虑下面的查询 < /
CREATE TABLE [dbo].[Register](
[RegisterID] [int] NULL,
[GroupID] [int] NULL,
[TestID] [int] NULL)
CREATE TABLE [dbo].[Price](
[ID] [int] NULL,
[GroupID] [int] NULL,
[Price] [bigint] NULL,
[Status] [bit] NULL)
<强>假设与上面的图像类似的信息,请考虑下面的查询<强> < /P> 输出将显示如下所示。
我希望价格表的第一行和第二行都会显示出来。那么,我的错误在哪里?我应该如何更改查询以获得正确的输出?当前出现在
where
子句中的Register
表的限制必须移动到on
子句以获得您想要的行为:
SELECT p.*
FROM Register r
RIGHT JOIN Price p ON r.GroupID = p.GroupID AND r.TestID = 50;
WHERE p.Status = 1
请注意,更典型的情况是,您可以通过左连接表达上述内容:
当前出现在
WHERE
子句中的Register
表的限制必须移动到on
子句中才能获得所需的行为:
SELECT p.*
FROM Register r
RIGHT JOIN Price p ON r.GroupID = p.GroupID AND r.TestID = 50;
WHERE p.Status = 1
请注意,更典型的情况是,您可以通过左连接表达上述内容:
我通常从不使用用户
右键加入
,因为我发现很难跟上。我总是使用左连接
请在代码问题中给出一个--cut&paste&runnable代码,包括最小的代表性示例输入代码;期望和实际输出(包括逐字记录错误消息);标签和版本;清晰的说明和解释。尽可能少地给出代码,即显示为OK的代码,并通过显示为not OK的代码进行扩展。(调试基础。)用于包含DBMS和DDL(包括约束和索引)的SQL,并将其作为格式化为表的代码输入。暂停对总体目标的工作,将代码切掉到第一个表达式,不要给出你期望的内容,说出你期望的内容和原因。我通常从不使用右键连接,因为我发现很难理解。我总是使用左连接
请在代码问题中给出一个--cut&paste&runnable代码,包括最小的代表性示例输入代码;期望和实际输出(包括逐字记录错误消息);标签和版本;清晰的说明和解释。尽可能少地给出代码,即显示为OK的代码,并通过显示为not OK的代码进行扩展。(调试基础。)用于包含DBMS和DDL(包括约束和索引)的SQL,并将其作为格式化为表的代码输入。在总体目标上暂停工作,在第一个表达中删去代码,不要给出你的期望,说出你的期望和原因。@RashidBagheri。我想强调Tim的建议,即使用LEFT JOIN
而不是RIGHT JOIN
@GordonLinoff,但是有些文化从右向左阅读-因此,对于那些从左向右阅读的人来说,右连接和左连接一样有意义。@Smor。那很好。SQL是从左到右的,因此A JOIN B JOIN C
被解析为(A JOIN B)JOIN C
。虽然从左到右的阅读对于从左到右的字母更直观,但子句的解析方式可能是更重要的考虑因素(即使非常微妙)。@Tim Biegeleisen不幸的是,此查询给出的结果与以前相同,并显示重复的记录。还有别的解决办法吗?(见:或)@RashidBagheri。我想强调Tim的建议,即使用LEFT JOIN
而不是RIGHT JOIN
@GordonLinoff,但是有些文化从右向左阅读-因此,对于那些从左向右阅读的人来说,右连接和左连接一样有意义。@Smor。那很好。SQL是从左到右的,因此A JOIN B JOIN C
被解析为(A JOIN B)JOIN C
。虽然从左到右的阅读对于从左到右的字母更直观,但子句的解析方式可能是更重要的考虑因素(即使非常微妙)。@Tim Biegeleisen不幸的是,此查询给出的结果与以前相同,并显示重复的记录。还有别的解决办法吗?(见:或)
SELECT p.*
FROM Price p
LEFT JOIN Register r ON r.GroupID = p.GroupID AND r.TestID = 50
WHERE p.Status = 1;