Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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_Left Join_Right Join - Fatal编程技术网

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;