2014-07-10 27 views
0

說我有一個這樣的查詢:SQL - 引用內部聯接的where子句中的列的速度更快/更好的方法是什麼?

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

這是真的,因爲有一個內部聯接,我可以從表1連指在表2的狀態欄?像這樣:

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

如果是的話,兩種方式中最好的是什麼?

+0

不,只有'table1'也有'status'-列纔有效。但是,它可能包含不同的數據。詳細說明一下,添加表名是爲了確定'JOIN'中的哪個表包含列(在多個表中出現相同的列名時),或者爲了便於閱讀,因此在數據來自。 – SchmitzIT

+0

不,這不是事實。你從哪裏得到這樣的想法? –

回答

1

如果我沒有弄錯,你要求在一個內部聯接中,同名的兩個字段,數據類型和長度將是特定查詢中的一個字段。從技術上講,情況並非如此。無論如何,Table1.Status將參考Table1Table2.Status將參考Table2的條件/值。

上述兩個查詢可以產生彼此不同的結果。

一個很好的規則是,在這種情況下,您將條件放在基表上,或Table1。如果一個字段專屬於另一個表,那麼您將使用該表的字段。

0

不,這是不正確的。通過內部連接你正在做的是說如果你有table1的m行和表2的n行然後第三個SET將通過加入這兩個表將產生m * n行根據你提到的匹配條件where子句。它不是m + n行,或者兩個表中的infact列在數據庫級別沒有合併。狀態列將保留在已定義的表中。

希望有幫助!

0

你可以看到這是不是這樣的,如果你做

CREATE TABLE table1 (id INT, name VARCHAR); 

CREATE TABLE table2 (id INT, status INT); 

現在,如果你運行你的第二個查詢,因爲你指的t1.status你會得到一個錯誤,並且狀態欄不存在表t1。

如果兩個表中都有一個狀態字段,查詢就會運行,但可能不會給出你想要的結果,例如,假設table1中的狀態始終爲1,而table2中的狀態始終爲0.現在,您的第一個查詢可能永遠不會返回行,但您的第二個查詢肯定會返回行。

相關問題