在JOIN条件下传递输入

时间:2018-08-17 03:35:54

标签: sql oracle join

这两个查询的逻辑是否相同?哪一个合适?

SELECT *
FROM TESTTABLE1 TBL1
INNER JOIN TESTTABLE2 TBL2 ON TBL2.ID = '123'
WHERE TBL2.APP_ID = TBL1.ID;

SELECT *
FROM TESTTABLE1 TBL1
INNER JOIN TESTTABLE2 TBL2 ON TBL2.APP_ID = TBL1.ID
WHERE TBL2.ID = '123';

请给出解释,谢谢;)

2 个答案:

答案 0 :(得分:4)

ON子句旨在定义用于联接两个表的条​​件,WHERE子句旨在将附加的过滤器应用于联接的结果集。这种意图的明确性是ANSI 92语法的优点之一。

第二个查询符合此意图并且易于阅读。

另一方面,第一个查询使这种清晰度消失了。它在ON子句中具有过滤器,在WHERE子句中具有连接条件。很难理解,因为它不符合预期的事物方式。读取这样的语句会使我们不寒而栗,因为现在我们正试图弄清为什么您以这种方式而不是通常的方式编写查询。

所以不要这样做。无论它产生的结果是否与第二个查询相同,都没有充分的理由故意编写令人困惑的代码。

答案 1 :(得分:1)

SELECT *
FROM TESTTABLE1 TBL1
INNER JOIN TESTTABLE2 TBL2 ON TBL2.ID = '123'
WHERE TBL2.APP_ID = TBL1.ID;

第一个将返回ID及其编号(如果有)的ID号“ 123”。

SELECT *
FROM TESTTABLE1 TBL1
INNER JOIN TESTTABLE2 TBL2 ON TBL2.APP_ID = TBL1.ID
WHERE TBL2.ID = '123';

第二个将返回所有ID,但是只有ID'123'会与之关联任何行。

使用INNER JOIN,这些子句实际上是等效的。但是,仅仅因为它们在功能上相同而产生相同的结果,并不意味着这两种子句具有相同的语义。