等于此右连接的左连接是什么?
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.Sid
、class1
和 class2
得到了明确的解析。 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;
先谢谢了
我的右连接工作正常,但是当我尝试将其更改为左连接时出现错误。
问题是要从 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.Sid
、class1
和 class2
得到了明确的解析。 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;