2013-05-06 79 views
2

我正在研究與Oracle連接的PHP page。我遇到了這個SQL,我不確定它在做什麼,所以我想我會問這裏。有問題的SQL是這樣的:SQL中AND與WHERE子句的用法

select tableA.id, tableA.name, tableB.details 
from tableA 
left join tableB on 
tableB.id = tableA.id 
and 
tableB.logId = '<logged_in_user>' 

現在,當我登錄爲誰沒有TableB中條目的用戶,我仍然得到記錄時,該查詢運行。我的假設是,而不是'and'該條款應該是'where'

left join tableB on 
    tableB.id = tableA.id 
    where 
    tableB.logId = '<logged_in_user>' 

所以我的兩個問題是。

  1. 我說錯了嗎?
  2. 如果是這樣,那麼爲什麼查詢返回結果?子句檢查是什麼'and'

有人可以解釋在上述查詢中使用AND vs WHERE時的區別嗎?

在此先感謝!

+0

既然你沒有告訴我們tableA和tableB是什麼,或者你想從這個查詢中看到什麼樣的行爲,我們不能告訴你這個查詢應該是什麼。我們所能做的就是指出「left join tableB on ... where tableB.logId = ...'將永遠是錯誤的。 – 2013-05-06 14:22:16

回答

7

對嗎?

號這個查詢:

select tableA.id, tableA.name, tableB.details 
from tableA 
left join tableB 
on tableB.id = tableA.id 
and tableB.logId = '<logged_in_user>' 

是非常不同:

select tableA.id, tableA.name, tableB.details 
from tableA 
left join tableB 
on tableB.id = tableA.id 
where tableB.logId = '<logged_in_user>' 

這是用於連接標準。

在第一種情況下,您從A取得數據,然後在存在匹配的ID logId時加入B,否則請留下詳細信息null。

在第二個,你從A點拿,那麼結果與B連接時,有一個匹配的ID,否則留下詳細空,然後你從A那裏的,有一個LOGID一個B匹配只保留行 - 消除在這個過程中來自A的行,事實上將它變成一個內部連接。

+0

+1,因爲這是一種替代方案,但是它不是利用「INNER JOIN」以更清潔的方式解決問題嗎? – 2013-05-06 14:18:16

+0

是的,我偶然編輯了我的最後一段來添加這個評論。 :) – 2013-05-06 14:18:52

+0

非常感謝!這解釋了很多..我仍然困惑的唯一一件事是:在第一個,因爲logId不會找到匹配的登錄用戶,它應該不給任何結果?因爲條件'和tableB.logId ='''不會有結果? – 2013-05-06 14:19:44

2

如果您只想要兩個表格中的值,那麼您真正需要的是內部連接。一旦你有了這些,過濾結果的位置並不重要。

2

現在,當我以tableB中沒有條目的用戶身份登錄時,在查詢運行時,我仍然收到記錄。

只需更改查詢使用一個inner join這樣的:

select tableA.id, tableA.name, tableB.details 
from tableA 
inner join tableB ... 

這裏是left join從Oracle定義:

的LEFT JOIN(也稱爲LEFT OUTER JOIN)關鍵字返回左表(table_name1)中的所有行,即使右表(table_name2)中沒有匹配項也是如此。

inner join的定義是:

的INNER JOIN關鍵字返回行當存在兩個表中的至少一個匹配。

+0

謝謝!我意識到,內部連接是去這裏的方式...我只是仍然試圖圍繞我的頭爲什麼AND子句給了我結果 - 我想我將不得不閱讀更多關於連接.. – 2013-05-06 14:21:26

+0

@open_sourse,因爲你需要利用'IS NOT NULL'來處理NULL值,所以你必須添加到WHERE子句中。 – 2013-05-06 14:22:09

+0

感謝您的幫助! – 2013-05-06 14:28:20