你的描述有點混亂,但我認爲這是你想要的。外部聯接確保您從TPM_Questions_Default獲取所有內容,並且只能從customerQuestions中找到匹配的內容。然後,如果customerQuestions.selected = true時,你得到的 - 否則,你得到錯誤的(C.selected將是NULL對於不加入到q行)
SELECT
Q.Question_ID
, Q.Question
, Q.Department
, C.CustomerId
, CASE
WHEN C.selected = true THEN true
ELSE false
END AS Selected
FROM
TPM_Questions_Default AS Q
LEFT OUTER JOIN
customerQuestions AS C ON Q.Question_ID = C.Question_ID
而且,我把客戶ID的選擇假設question_id可能在customerQuestions中存在多次(對於每個已回答的客戶)。
小型更新:請參閱@ CSL關於使用COALESCE()而不是case語句的評論。同樣的總體思想,只是簡潔的語法。而且,兩者都有些依賴於所選列的數據類型。如果它是一個比特值,你將比較並返回0和1(而不是真和假)。而且,當然,如果是字符數據,這將是「真」和「假」
另一個更新:
@ user979331想添加WHERE CUSTOMER_ID = 1234567因爲CUSTOMER_ID在customerQuestions表,這會將OUTER JOIN轉換爲隱式INNER JOIN。要解決此問題,條件將移動到JOIN下面
SELECT
Q.Question_ID
, Q.Question
, Q.Department
, C.Customer_Id
, COALESCE(C.selected, 0) AS Selected
FROM
TPM_Questions_Default AS Q
LEFT OUTER JOIN
customerQuestions AS C ON Q.Question_ID = C.Question_ID AND C.Customer_ID = 1234567
我會使用COALESE(C.Selected,0)作爲Selected而不是Case語句。 – CSL
@ CSL是的 - 這是更清潔 - thx –
我明白的混亂,我忘記提到的東西,在我使用WHERE Customer_ID = 1234567,我想要的是所選的值(真或假)WHERE Customer_ID = 1234567,同時返回所有問題。在您的解決方案中添加WHERE Customer_ID = 1234567僅返回與Customer_ID相關的問題 – user979331