PostgreSQL LEFT OUTER JOIN条件不起作用

时间:2016-12-03 19:51:42

标签: sql postgresql join conditional

这个带有几个条件的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;

2 个答案:

答案 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%';

更简单,应该有更好的表现。