2011-10-15 92 views
1

我有3個表; CASESUSERSUSER_META。對於這個問題,你需要知道USER_META表有3列; user_idmeta_keymeta_valueOracle SELECT WHERE值存在或不存在

每個用戶都與許多CASES相關聯,並且每個USER與許多USER_META

我當前的查詢是這樣的

SELECT CASES.*, USERS.*, USER_META.* 
FROM CASES 
JOIN USERS ON USERS."user_id" = CASES."user_id" 
JOIN USER_META ON USER_META_"user_id" = USERS."user_id" 

這種方法的問題是,每個用戶相關有USER_META的LOT,所以我的結果集有太多的行。我怎麼可以重寫此查詢,以便在USER_META。「meta_key」等於某個值我只能選擇USER_META但仍得到的結果,如果他們沒有這個USER_META。「meta_key」尚且

例如:

SELECT CASES.*, USERS.*, USER_META.* 
FROM CASES 
JOIN USERS ON USERS."user_id" = CASES."user_id" 
JOIN USER_META ON USER_META_"user_id" = USERS."user_id" 
WHERE USER_META."meta_key" = 'my_key' 

這將工作的偉大,但並不是所有的用戶都在「meta_key」列中的「my_key」的價值,我們仍需要觀察他們的情況。對於沒有「meta_key」的用戶,結果應該只返回CASE和USER列。

我該如何重寫這個查詢,以便它爲這兩個用戶使用此meta_key而不使用?

謝謝,我希望這是有道理的。

+0

'選擇個案*,用戶*,USER_META *' - 結果集將包括重複列,這是不是。一個好主意。 – onedaywhen

回答

4

我會用一個LEFT JOIN

SELECT CASES.*, USERS.*, USER_META.* 
FROM CASES 
JOIN USERS ON USERS."user_id" = CASES."user_id" 
LEFT JOIN USER_META ON USER_META."user_id" = USERS."user_id" AND USER_META."meta_key" = ? 
+0

太好了,看起來我把WHERE/AND子句放在了錯誤的地方。將該邏輯放入JOIN語句是解決方案。謝謝! – Mike

+0

@Mike:該鍵有兩個部分:將邏輯放入JOIN並使其成爲(外部)'LEFT JOIN'。 –