Изменение поддельных столбцов на основе значений запроса - PullRequest
0 голосов
/ 03 мая 2019

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

По сути, я хочу, чтобы приведенный ниже код мог изменить 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 и т. д.) имеет тестовую информацию в них имы стараемся, чтобы все прошли все тесты.Этот запрос дает мне список людей, которые пропустили тест, но не говорит мне, какие тесты они пропустили, это то, что я пытаюсь выяснить.

Ответы [ 4 ]

0 голосов
/ 03 мая 2019

При условии, что условия 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 голосов
/ 03 мая 2019

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 голосов
/ 03 мая 2019
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 голосов
/ 03 мая 2019
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...