等于此右连接的左连接是什么?

What is the left join that equals this righ join?

先谢谢了

我的右连接工作正常,但是当我尝试将其更改为左连接时出现错误。

问题是要从 table 班级 1 的分数高于班级 2 的分数学生 table 称为 SC 的学生那里获取有关学生的所有信息。

学生(SId,Sname,Sage,Ssex)

SC(SId,CId,分数)

这是我的正确加入:

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

一般来说,如果您有一个正确的连接查询:

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;

第一个有效的查询在这里:

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;

正在通过此子查询创建 table 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.Sidclass1class2 得到了明确的解析。 t1.Sid 在联接 Student.SId = r.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:Table 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;