sql - 在带有内连接的where子句中引用列的更快/更好的方法是什么?

时间:2014-07-10 09:48:05

标签: sql performance syntax inner-join where-clause

说我有这样的查询:

select table1.id, table1.name
from table1
inner join table2 on table1.id = table2.id
where table1.name = "parent" and table2.status = 1

是不是因为有内连接,我甚至可以从table1引用table2&#39的状态列?像这样:

select table1.id, table1.name
from table1
inner join table2 on table1.id = table2.id
where table1.name = "parent" and table1.status = 1

如果是的话,这两种方式中最好的是什么?

3 个答案:

答案 0 :(得分:1)

如果我没有弄错,你要求在内部联接中,两个具有相同名称,数据类型和长度的字段将是特定查询中的一个字段。从技术上讲,情况并非如此。无论如何,Table1.Status将引用Table1Table2.Status将引用Table2的条件/值。

上面的两个查询产生了不同的结果。

对此的一个好的规则是,在这种情况下,您将条件放在基表上,或Table1。如果某个字段对另一个表是独占的,那么当您使用该表的字段时就是这样。

答案 1 :(得分:0)

不,那不是真的。通过Inner join你要做的就是说如果你有一个m行的table1和有n行的table2那么通过连接这两个表生成的第三个SET将根据匹配条件有m * n行你在where子句中提到过。这不是m + n行或两个表中的infact列未在数据库级别合并。状态列将保留在已定义的表中。

希望有所帮助!!!

答案 2 :(得分:0)

如果你这样做,你可以看到不是这种情况

CREATE TABLE table1 (id INT, name VARCHAR);

CREATE TABLE table2 (id INT, status INT);

现在,如果您运行第二个查询,则会出现错误,因为您引用了t1.status,并且表t1中不存在状态列。

如果两个表中都有状态字段,则查询将会运行,但可能无法提供您想要的结果,例如假设table1中的状态始终为1,而table2中的状态始终为0.现在,您的第一个查询永远不会返回行,但您的第二个查询肯定会返回行。