2015-10-13 4 views
1

У меня есть запрос, например, так:SQL, если условие для значения

SELECT Question_ID, Question, department FROM TPM_Questions_Default 

Теперь мне нужно другое значение к нему под названием выбран, это может быть либо истинным или ложным.

У меня есть еще одна таблица называется customerQuestions, который имеет Question_ID, customer_id и выбранное значение (истина или ложь)

То, что я пытаюсь сделать, это вернуть все вопросы в TPM_Questions_Default и если Question_ID для Customer_ID существуют использования, что если он не отмечен как false.

Я попытался использовать внутреннее соединение, но это возвращает только вопросы, связанные с customer_ID, и не все вопросы.

Я надеюсь, что это имеет смысл.

UPDATE

Я забыл упомянуть в конце этого запроса, когда его сделали, мне нужно будет использовать WHERE Customer_ID = 123456, чтобы получить значение

ответ

2

Ваше описание является немного запутанным, но Я думаю, это то, что вы хотите. Внешнее соединение гарантирует, что вы получите все, начиная с TPM_Questions_Default и только с совпадений с customerQuestions. Тогда, если customerQuestions.selected = верно, то вы получите, что - в противном случае, вы получите ложным (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 

Кроме того, я поставил КодКлиент в выборе предполагая, что question_id может существовать несколько раз в customerQuestions (для каждого ответившего клиента).

SMALL UPDATE: См. Комментарий CSL об использовании COALESCE() вместо утверждения case. Такая же общая идея, просто более чистый синтаксис. Кроме того, оба они в некоторой степени зависят от типа данных выбранного столбца. Если это бит, вы бы сравнивали и возвращали 0 и 1 (в противоположность true и false). И, конечно, если это символьные данные, было бы 'истина' и 'ложь'

ДРУГОЙ UPDATE:

@ user979331 хотел добавить WHERE Customer_ID = 1234567. Поскольку Customer_ID находится в customerQuestions table, это преобразует 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 
+1

Я использовал бы «COALESE (C.Selected, 0) как Selected» вместо «Case Statement». – CSL

+0

@CSL Да, это чище - thx –

+0

Я понимаю путаницу, я забыл что-то упомянуть, в конце запроса я использую WHERE Customer_ID = 1234567, и все, что я хочу, это выбранное значение (true или false) WHERE Customer_ID = 1234567, возвращая все вопросы. Добавление WHERE Customer_ID = 1234567 к вашим решениям возвращает только вопросы, связанные с Customer_ID – user979331

Смежные вопросы