这个带有几个条件的LEFT OUTER JOIN不起作用,它可能是显而易见的。它返回所有不同sid的结果,而根本不执行条件。
SELECT
count(distinct student_status.sid)
FROM studentcoursedb.student_status
LEFT OUTER JOIN studentcoursedb.student_status AS t0
ON t0.sid = student_status.sid
AND t0.term < student_status.term
AND student_status.major LIKE 'ABC%';
结果,32684是总不同sids的计数,该查询返回的值相同:
select count(distinct sid)
from studentcoursedb.student_status;
答案 0 :(得分:1)
两个查询
SELECT
count(distinct student_status.sid)
FROM studentcoursedb.student_status
LEFT OUTER JOIN studentcoursedb.student_status AS t0
ON t0.sid = student_status.sid
AND t0.term < student_status.term
AND student_status.major LIKE 'ABC%';
select count(distinct sid)
from studentcoursedb.student_status;
正确返回相同数量的行,因为
你离开加入(左连接或左外连接是相同的)同一个表这意味着得到的行数与主表的数量相同
如果您想要子集匹配,则应使用内连接(或其他连接关系)
答案 1 :(得分:0)
LEFT OUTER JOIN
会保留第一个表中的所有行以及第二个中的匹配行。因此,它不会过滤第一个表。您正在计算第一个表中的列。因此,LEFT OUTER JOIN
不会影响不同的计数。
如果要过滤行,请改用INNER JOIN
。我还将条件移到WHERE
子句:
SELECT count(distinct ss.sid)
FROM studentcoursedb.student_status ss INNER JOIN
studentcoursedb.student_status ss2
ON ss2.sid = ss.sid
WHERE ss2.term < ss.term AND ss.major LIKE 'ABC%';
我应该注意到我认为你不需要自我加入。你考虑过了吗?
select dense_rank(ss.term) over (order by term)
from studentcoursedb.student_status ss
where ss.major like 'ABC%';
更简单,应该有更好的表现。