说我有这样的查询:
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
如果是的话,这两种方式中最好的是什么?
答案 0 :(得分:1)
如果我没有弄错,你要求在内部联接中,两个具有相同名称,数据类型和长度的字段将是特定查询中的一个字段。从技术上讲,情况并非如此。无论如何,Table1.Status
将引用Table1
而Table2.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.现在,您的第一个查询永远不会返回行,但您的第二个查询肯定会返回行。