我有这样的查询:
SELECT Question_ID, Question, department FROM TPM_Questions_Default
现在我需要另一个名为selected的值,这可以是true或false。
我有另一个名为customerQuestions的表,它有一个Question_ID,Customer_ID和选定的值(true或false)
我要做的是返回TPM_Questions_Default中的所有问题,如果Customer_ID的Question_ID存在,则使用所选的,如果它没有标记为选择为false。
我尝试过使用内部联接,但这只返回与customer_ID相关的问题,而不是所有问题。
我希望这是有道理的。
更新
我忘了在这个查询结束时提到它完成后,我需要使用WHERE Customer_ID = 123456来获取值
答案 0 :(得分:2)
您的描述有点令人困惑,但我认为这就是您想要的。外部联接确保您从TPM_Questions_Default获取所有内容,并且只从customerQuestions获取匹配内容。然后,如果customerQuestions.selected = true,则得到 - 否则,您得到错误(对于不加入Q的行,C.selected将为NULL)
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
此外,我将CustomerID放在选择中,假设question_id可能在customerQuestions中存在多次(对于每个回答的客户)。
SMALL UPDATE:请参阅@ CSL关于使用COALESCE()而不是case语句的评论。相同的一般想法,只是更清晰的语法此外,两者都在某种程度上取决于所选列的数据类型。如果它是一个位值,你将比较并返回0和1(而不是true和false)。而且,当然,如果是字符数据,它将是真实的'并且' false'
另一个更新:
@ user979331想要添加WHERE Customer_ID = 1234567.因为Customer_ID位于customerQuestions表中,所以这会将OUTER JOIN转换为隐式INNER JOIN。要解决此问题,条件将移至
下的JOINSELECT
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