我有一个数据库,处理有关向谁发出通行证的信息。当某人失去通行证时,会重新签发,但会记录为第二期。
我试图写一个已发出的每个传递的查询,以及是否需要进行热插拔。
我已经在这里工作了:http://sqlfiddle.com/#!9/ed700/4
但是当我尝试将员工姓名添加到查询中时,它会中断(表示' on'子句中有一个未知的列):http://sqlfiddle.com/#!9/ed700/6(第3,15和25行有已添加)
我不知道造成这种情况的原因......
P.S。这是数据库结构的简化版本,以便于发布。
答案 0 :(得分:5)
混合ansi Joins和非ansi Joins并不是一个好习惯。查询可以重写为:
SELECT
PassProcessing.Serial AS Serial,
Passes.Type AS CardType,
PassProcessing.Issue AS IssueNumber,
Employees.Name,
(CASE WHEN sub.count > PassProcessing.Issue
OR PassProcessing.Cancelled = 1
THEN 1
ELSE 0
END) AS Hotlist
FROM Passes
JOIN PassProcessing ON Passes.ID = PassProcessing.Passes_ID
JOIN Employees ON Passes.Employee_ID = Employees.ID
LEFT JOIN
(SELECT Passes_ID, COUNT(*) AS count
FROM PassProcessing
GROUP BY Passes_ID) sub
ON PassProcessing.Passes_ID = sub.Passes_ID
可以找到确切原因on this page.
以前,逗号运算符(,)和JOIN都有相同的含义 优先级,因此连接表达式t1,t2 JOIN t3被解释为 ((t1,t2)JOIN t3)。现在JOIN具有更高的优先级,所以表达式 被解释为(t1,(t2 JOIN t3))。此更改会影响语句 使用ON子句,因为该子句只能引用列 在连接的操作数中,优先级的变化会发生变化 解释这些操作数是什么。