【问题标题】:Sql query: How to use right outer join correctlysql查询:如何正确使用右外连接
【发布时间】:2020-11-14 02:43:41
【问题描述】:

我必须表格:注册和价格。

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) 

假设信息与上图类似,请考虑以下查询

SELECT        Price.*
FROM            Register RIGHT OUTER JOIN Price ON Register.GroupID = Price.GroupID
WHERE        (Price.Status = 1) AND (Register.TestID = 50)

输出将如下图所示。

我的期望是显示价格表的第一行和第二行。那么我的错误在哪里,我应该如何更改查询以获得正确的输出?

【问题讨论】:

  • 我通常从不使用right join,因为我觉得很难跟上。我总是使用left join
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停整体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。

标签: sql sql-server left-join right-join


【解决方案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

请注意,更典型的是,您会通过 left 连接来表达上述内容:

SELECT p.*
FROM Price p
LEFT JOIN Register r ON r.GroupID = p.GroupID AND r.TestID = 50
WHERE p.Status = 1;

【讨论】:

  • @RashidBagheri。 . .我想强调蒂姆的建议是使用LEFT JOIN 而不是RIGHT JOIN
  • @GordonLinoff 但是有些文化从右到左阅读 - 所以右连接对于从左到右阅读的文化来说就像左连接一样有意义。
  • @Smor 。 . .那很好。 SQL 是从左到右的,所以A JOIN B JOIN C 被解析为(A JOIN B) JOIN C。虽然从左到右的阅读对于从左到右的字母来说更直观,但解析子句的方式可能是更重要(即使非常微妙)的考虑因素。
  • @Tim-Biegeleisen 不幸的是,此查询给出的结果与以前相同,并显示重复记录。还有其他解决方案吗? (参见:imgur.com/e1AXGRYimg.techpowerup.org/200725/1.png
猜你喜欢
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 2017-11-16
  • 2019-05-03
相关资源
最近更新 更多