Я пытаюсь выполнить запрос и изменить поддельные значения столбца в зависимости от того, возвращают ли внутренние запросы что-либо.

По сути, я хочу, чтобы приведенный ниже код мог изменить WI на 1, если id находится в table2, и SI на 1, если id находится в table3.

SELECT name, grade, id, 0 as WI, 0 as SI FROM students
WHERE id in table1
AND (id in table2
OR id in table3)

Я гуглил, но ничего не наткнулся, думаю, в основном потому, что не знаю, как на самом деле называются «поддельные» столбцы.

Любая помощь будет оценена, спасибо!

Изменить: данные выглядят примерно так:

name  grade  id
s1    1      0
s2    1      1
s3    2      7

И цель состоит в том, чтобы что-то подобное появилось после запроса:

name  grade  id  WI  SI
s1    1      0   0   1
s2    1      1   1   1
s3    2      7   1   0

РЕДАКТИРОВАТЬ 2: Вот мой фактический запрос:

SELECT CARE1.students.first_name, CARE1.students.grade, CARE1.students.id, 
CARE1.student_test_info.test_num, CARE1.student_test_info.date_of_testing,
0 as WI, 0 as SI, 0 as OC, 0 as SL 
FROM CARE1.students INNER JOIN CARE1.student_test_info ON CARE1.students.id = CARE1.student_test_info.student_id

WHERE id IN (SELECT DISTINCT studentID from CARE1.WI)
AND (id NOT IN (SELECT DISTINCT studentID from CARE1.SI)
OR id NOT IN (SELECT DISTINCT studentID from CARE1.OC))

В основном, каждая из таблиц (WI, SI и т. Д.) Содержит информацию о тестах, и мы стараемся, чтобы все проходили все тесты. Запрос работает, давая мне список людей, которые пропустили тест, но не говорит мне, какие тесты они пропустили, это то, что я пытаюсь выяснить.

0
Jacob D 3 Май 2019 в 17:22

4 ответа

Лучший ответ

Предполагая, что условия WHERE верны - вы можете использовать те же условия в предложении SELECT:

SELECT
    CARE1.students.first_name,
    CARE1.students.grade,
    CARE1.students.id, 
    CARE1.student_test_info.test_num,
    CARE1.student_test_info.date_of_testing,
    id IN (SELECT DISTINCT studentID from CARE1.WI) as WI, -- is always 1 due to WHERE condition
    id IN (SELECT DISTINCT studentID from CARE1.SI) as SI,
    id IN (SELECT DISTINCT studentID from CARE1.OC) as OC,
    0 as SL -- What is SL?
FROM CARE1.students
INNER JOIN CARE1.student_test_info
    ON CARE1.students.id = ARE1.student_test_info.student_id
WHERE id IN (SELECT DISTINCT studentID from CARE1.WI)
  AND (id NOT IN (SELECT DISTINCT studentID from CARE1.SI)
    OR id NOT IN (SELECT DISTINCT studentID from CARE1.OC))

Однако - я бы предложил использовать EXISTS подзапросы вместо IN. А также используйте предложение HAVING с псевдонимами вычисляемых столбцов, чтобы избежать дублирования кода:

SELECT
    CARE1.students.first_name,
    CARE1.students.grade,
    CARE1.students.id, 
    CARE1.student_test_info.test_num,
    CARE1.student_test_info.date_of_testing,
    1 as WI, -- is always 1 due to WHERE condition
    EXISTS (SELECT * from CARE1.SI WHERE CARE1.SI.studentID = CARE1.students.id) as SI,
    EXISTS (SELECT * from CARE1.OC WHERE CARE1.OC.studentID = CARE1.students.id) as OC,
    0 as SL -- What is SL?
FROM CARE1.students
INNER JOIN CARE1.student_test_info
    ON CARE1.students.id = ARE1.student_test_info.student_id
WHERE EXISTS (SELECT * from CARE1.WI WHERE CARE1.WI.studentID = CARE1.students.id)
HAVING SI = 0
    OR OC = 0
0
Paul Spiegel 3 Май 2019 в 15:29

INNER Присоединитесь к table1, чтобы получить только существующие там идентификаторы. ПРИСОЕДИНЯЙТЕСЬ К таблицам 2 и 3. Использование оператора case даст вам возможность отображать любое пользовательское значение, основанное на этой логике, если вам нужно что-то кроме 0 или 1 ...

SELECT name, 
        grade, 
        id, 
        CASE WHEN t2.ID IS NOT NULL THEN 1 ELSE 0 END as WI --update with any value you want to display, 
        CASE WHEN t3.ID IS NOT NULL THEN 1 ELSE 0 END as SI 
    FROM 
        students s INNER JOIN
        table1 t1 on s.id = t1.id LEFT OUTER JOIN
        table2 t2 on s.id = t2.id LEFT OUTER JOIN
        table3 t3 on s.id = t3.id
0
FizzBuzz 3 Май 2019 в 14:30
SELECT name, grade, id, 1 as WI, 0 as SI FROM students
WHERE id in table1
AND id in table2
UNION
SELECT name, grade, id, 0 as WI, 1 as SI FROM students
WHERE id in table1 AND
id in table3
0
pringi 3 Май 2019 в 14:27
SELECT s.name, s.grade, s.id,
 MAX(t2.id IS NOT NULL) AS WI,
 MAX(t3.id IS NOT NULL) AS SI 
FROM students s
LEFT JOIN table2 t2
ON s.id = t1.id
LEFT JOIN table3 t3
ON s.id = t3.id
GROUP BY s.id
0
Alex 3 Май 2019 в 14:31