Что такое левое соединение, равное этому правому соединению?

Сперва спасибо

У меня это правое объединение работало нормально, но когда я пытаюсь превратить его в левое объединение, я получил ошибку.

Вопрос состоит в том, чтобы получить всю информацию о студентах из таблицы "Студент", которая имеет более высокий балл в классе 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;
Другие вопросы по тегам