2016-03-21 283 views
0

嘗試使用IF EXISTS自動選擇要從哪個表中選擇記錄。MySQL如果EXISTS不起作用

我剛剛收到下面的錯誤消息,下面的代碼。

我哪裏錯了?

IF EXISTS (SELECT 1 FROM Users WHERE Reference='USR00000007') 
    SELECT * FROM Users WHERE Reference='USR00000007' 
ELSE 
    SELECT * FROM Staff WHERE Reference='USR00000007'; 

錯誤:#1064 - 您的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在第1行選擇* FROM'IF EXISTS(SELECT 1 FROM Users WHERE引用='USR00000007')'附近使用

+0

https://blogs.msdn.microsoft.com/miah/2008/02/17/sql-if-exists -update-else-insert/ – Rs2845

+0

(順便說一句,我對SQL的知識很低,我正在學習,因爲我正在與這個項目合作) – Rs2845

+2

爲什麼你要將一篇文章鏈接到如何在SQL Server中使用IF EXISTS當你使用MySQL? – Lamak

回答

2

問題出在MySQL。作爲控制流程的IF僅適用於編程塊,如存儲過程,存儲函數和觸發器。

假設列是兩個表中的一樣,你可以做你想做的是一個單一的查詢:

SELECT u.* 
FROM Users u 
WHERE u.Reference = 'USR00000007' 
UNION ALL 
SELECT s 
FROM Staff s 
WHERE s.Reference = 'USR00000007' AND 
     NOT EXISTS (SELECT 1 FROM Users u2 WHERE u2.Reference = 'USR00000007') 
+0

只需提及,我需要從任一表中返回的所有行。職員表有2列少。我是否需要手動列出我想要的確切的,而不是做你的*。和s。*? – Rs2845

+0

你確定他在用戶和員工上有相同的字段嗎? –

+0

並非所有人都是一樣的。用戶有其他領域,而工作人員有一些不同的列。 – Rs2845

0
如果你希望兩個查詢的工會

,既桅杆具有相同的字段數(如果您需要,你可以添加空字段查詢)和字段應該有類似的類型,所以試試這個:

SELECT Users.id as user_id, null as staff_id, some_other_number_field, some_other_char_field 
FROM Users 
WHERE Reference='USR00000007' 
SELECT null , Staff.id, some_other_number_field, some_other_char_field 
FROM Staff 
WHERE Reference='USR00000007' 
and not EXISTS (SELECT 1 FROM Users WHERE Reference='USR00000007'); 

也許你需要這樣的查詢,總是隻能得到用戶的參考:

SELECT * 
FROM Users 
WHERE (Reference='USR00000007' 
or exists (
    SELECT 1 
    FROM Staff 
    WHERE Reference='USR00000007' 
    and Staff.user_id = Users.id)); 

但您必須具有類似於「and Staff.user_id = Users.id」的連接條件

+0

此代碼可以成功地從用戶表中檢索正確的記錄,但不是員工表。 我很驚訝,MySQL沒有更好的方式來處理條件。試圖將它作爲兩個單獨的查詢,並只與PHP if-else語句一起處理條件。 – Rs2845