2013-01-04 32 views
1

我正在与别人的代码苦苦挣扎。 WHERE子句在以下(MySQL)语句中可以做什么?SQL“IN”与WHERE子句中的“=”相结合

SELECT * FROM t1, t2 WHERE t1.id = t2.id IN (1,2,3) 

它没有提供我想要的结果,但我试图找出原作者的意图。 任何人都可以提供使用这样的WHERE子句的例子吗?

+1

你使用什么数据库,如果我没看错这个语法在SQL Server 2000中得到了支持,但不得迟 – Habib

+0

我会说这是如果一个bug该语法实际上是允许的 –

回答

4

这种情况从右侧开始,评估t2.id IN (1,2,3),得到结果(0或1),并将它用于与t1.id联接。来自IN列表的所有行t2id都连接到t1的行中,该行具有一个id; t2的所有其他行与t1中具有零的id的行连接。这是sqlfiddle.com的小演示:link

但很难想象这是作者的意图,但是:我认为更有可能的检查是两个项目都在列表中,并且也相互平等。彼此之间的平等很重要,因为它看起来像作者想要加入这两个表格。

更加现代的连接方式是使用ANSI SQL语法。这是您的查询的ANSI SQL等价的:

SELECT * FROM t1 JOIN t2 ON t1.id = t2.id IN (1,2,3) 
+0

有趣的是,在记者页面http://dev.mysql.com/doc/refman/5.5/en/operator-precedence.html甚至没有关于关联性的单词(来自我的+1 ) – zerkms

+0

我认为这是另一种方式... IN首先被评估,然后它的结果被用于连接。见http://sqlfiddle.com/#!2/6f2f5/1 – AndreKR

+0

@AndreKR我认为你是对的 - 它看起来像'IN'具有比'='更高的优先级。我不知道为什么我认为它是从左到右。我重写了这个问题的答案。非常感谢你! – dasblinkenlight