你的描述有点混乱,但我认为这是你想要的。外部联接确保您从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