Что такое левое соединение, равное этому правому соединению? - PullRequest
0 голосов
/ 27 апреля 2018

Спасибо первым.

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

Вопрос состоит в том, чтобы получить всю информацию о студентах из таблицы «Ученик, у которой более высокий балл в классе 1, чем в классе 2», из таблицы «балл-ученик» под названием SC.

Student (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 ]

0 голосов
/ 27 апреля 2018

Первый запрос, который работает здесь:

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;
0 голосов
/ 27 апреля 2018

Обычно, если у вас есть правильный запрос на присоединение:

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