【问题标题】:Equivalente to INNER等效于 INNER
【发布时间】:2019-06-29 01:11:42
【问题描述】:

我想构造一个不使用 INNER JOIN 的查询。我发现像这样的 INNER:

Select A.Name 
from A INNER JOIN B on (A.id1 = B.id1 AND A.id2 = B.id2)
Where B.id = @Id

产生相同的:

select A.Name 
from A 
where  
A.id1 in (select B.id1 from B where B.id = @Id)
and
A.id2 in (select B.id2 from B where B.id = @Id)

不是吗?

请注意,我的问题不是关于它是否更好,而是关于它是否是等价物或者该 INNER 没有等价物。

【问题讨论】:

  • 为什么?内连接比子查询好得多。
  • 我的问题是关于功能的等效性,而不是它是否更好。
  • 内部连接是否优于子查询取决于 dbms 和其他东西。
  • 您不能用 IN 或 EXISTS 条件替换 INNER JOIN。他们的意思不同。有时可以将一个重写为另一个,但并非总是如此。

标签: sql


【解决方案1】:

您的第二个查询可能会匹配来自不同 B 行的 id1 和 id2,因此该查询可能会返回预期之外的行。您必须将 id1 和 id2 保持在一起:

使用EXISTS:

select A.Name 
from A 
where exists (select * from B
              where A.id1 = B.id1 AND A.id2 = B.id2
                and B.id = @Id)

或“行和表构造函数”

select A.Name 
from A 
where (A.id1, A.id2) in (select B.id1,  B.id2 from B where B.id = @Id)

【讨论】:

  • 我不确定它是否与 INNER JOIN 相同,是吗?
  • @Ibai,可能更好,因为如果它是一对多关系,这些查询将不会返回重复的行。
  • Thx @jarlh 我同意你的观点,“行和表构造函数”似乎是正确的(并且可能更好)的方式。
  • 我也同意。这是编写查询的方式。您想要名称 FROM A WHERE EXISTS B 中的相关记录。(换句话说:您想要名称 FROM A WHERE 元组 id1/id2 是 IN 中的元组集B.) 这就是 SQL 的理念,您可以描述您要查找的内容。
猜你喜欢
  • 2014-08-19
  • 2016-10-31
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 2017-08-16
  • 2012-10-21
  • 2018-10-05
  • 2017-08-02
相关资源
最近更新 更多