Что такое левое соединение, равное этому правому соединению?
Сперва спасибо
У меня это правое объединение работало нормально, но когда я пытаюсь превратить его в левое объединение, я получил ошибку.
Вопрос состоит в том, чтобы получить всю информацию о студентах из таблицы "Студент", которая имеет более высокий балл в классе 1, чем в классе 2, из таблицы "балл-ученик" под названием SC.
Студент (Sid, $ name, шалфей, SSEx)
SC (Sid, ИДС,Score)
Вот мое ПРАВИЛЬНОЕ СОЕДИНЕНИЕ:
SELECT * FROM Student RIGHT JOIN (
SELECT t1.SId, class1, class2 FROM
(SELECT SId, score as class1 FROM sc WHERE sc.CId = '01')AS t1,
(SELECT SId, score AS class2 FROM sc WHERE sc.CId = '02')AS t2
WHERE t1.SId = t2.SId
AND t1.class1 > t2.class2
)r
ON Student.SId = r.SId;
И тогда я попробовал что-то вроде:
SELECT t1.SId, class1, class2, Student.* FROM
(SELECT SId, score as class1 FROM sc WHERE sc.CId = '01')AS t1,
(SELECT SId, score AS class2 FROM sc WHERE sc.CId = '02')AS t2
WHERE t1.SId = t2.SId
AND t1.class1 > t2.class2
)r
LEFT JOIN Student
ON Student.SId = r.SId;
но это не сработало.
Я довольно новичок в SQL, хотелось бы, чтобы вы немного объяснили.
Я использую MySQL5.7
2 ответа
Первый запрос, который работает здесь:
SELECT * FROM Student RIGHT JOIN (
SELECT t1.SId, class1, class2 FROM
(SELECT SId, score as class1 FROM sc WHERE sc.CId = '01')AS t1,
(SELECT SId, score AS class2 FROM sc WHERE sc.CId = '02')AS t2
WHERE t1.SId = t2.SId
AND t1.class1 > t2.class2
)r
ON Student.SId = r.SId;
Стол r
создается с помощью этого подзапроса:
SELECT t1.SId, class1, class2 FROM
(SELECT SId, score as class1 FROM sc WHERE sc.CId = '01')AS t1,
(SELECT SId, score AS class2 FROM sc WHERE sc.CId = '02')AS t2
WHERE t1.SId = t2.SId
AND t1.class1 > t2.class2
t1.Sid
, class1
а также class2
решены без двусмысленности. t1.Sid
становится доступным как r.Sid
в соединении Student.SId = r.Sid
, Следовательно, запрос работает.
Второй запрос, вызывающий проблему, находится здесь:
SELECT t1.SId, class1, class2, Student.* FROM
(SELECT SId, score as class1 FROM sc WHERE sc.CId = '01')AS t1,
(SELECT SId, score AS class2 FROM sc WHERE sc.CId = '02')AS t2
WHERE t1.SId = t2.SId
AND t1.class1 > t2.class2
)r
LEFT JOIN Student
ON Student.SId = r.SId;
Есть две проблемы, которые необходимо решить:
- Выпуск 1:
Student.*
не разрешается, так как в разделе FROM нет ссылок на него. - Проблема 2: Таблица
r
не строится правильно.
Две проблемы при решении приводят к этому измененному второму запросу, который работает:
SELECT * from
(SELECT t1.SId, class1, class2 FROM
(SELECT SId, score as class1 FROM sc WHERE sc.CId = '01')AS t1,
(SELECT SId, score AS class2 FROM sc WHERE sc.CId = '02')AS t2
WHERE t1.SId = t2.SId
AND t1.class1 > t2.class2
)r
LEFT JOIN Student
ON Student.SId = r.SId;
Как правило, если у вас есть правильный запрос на присоединение:
SELECT select_statement
FROM table1
RIGHT JOIN table2
ON join_condition;
Вы просто измените его на запрос левого соединения следующим образом:
SELECT select_statement
FROM table2
LEFT JOIN table1
ON join_condition;
Для вашего случая, когда вы изменили свой запрос на левое соединение, вы изменили select_statement, и он делает ошибку.
Просто примените вышеуказанное к вашему запросу:
SELECT *
FROM (
SELECT t1.SId, class1, class2
FROM
(SELECT SId, score as class1 FROM sc WHERE sc.CId = '01') AS t1,
(SELECT SId, score AS class2 FROM sc WHERE sc.CId = '02') AS t2
WHERE t1.SId = t2.SId
AND t1.class1 > t2.class2
) r
LEFT JOIN Student
ON Student.SId = r.SId;