问题是您试图访问在WHERE 和SELECT 子句中都没有告诉查询的表。当您在 SELECT 子句中说 Bill.BillID 时,您是说您想要来自名为 Bill 的表中的字段 BillID。
您的语法违反的规则是您不能在SELECT 或WHERE 子句中使用表名,除非您在FROM 子句(或JOIN)中提及它。
那么现在,让我们看看您的查询。
SELECT Bill.BillID, Duty.TaskTime
FROM Invoice
LEFT OUTER JOIN Duty.JobID = Bill.JobID
WHERE Job.CustomerID = Customer.CustomerID
这意味着您要从名为 Bill 和 Duty 的表中选择字段,并根据 Job 和 Customer 表中的字段过滤结果。但是,您只在 FROM 子句 (Invoice) 中按名称提及了一个表。您几乎加入了 Duty 表,但您将其加入到表中您尚未提及的位置 (Bill)。我将猜测您打算使用Bill 作为Invoice 的别名。这意味着你真正想要的更像是:
// Still incorrect
SELECT Bill.BillID, Duty.TaskTime
FROM Invoice AS Bill
LEFT OUTER JOIN Duty ON Duty.JobID = Bill.JobID
WHERE Job.CustomerID = Customer.CustomerID
但我们仍然没有提到WHERE 子句中引用的Job 或Customer 表。为了使用它们,您还需要JOIN 这些表。我们需要更多地了解您的架构才能弄清楚如何做到这一点,但我可以告诉您,您至少需要两个JOIN 子句。假设您在Invoice 表上有一个CustomerID 字段,我们可能希望像这样加入。
// speculative
SELECT Bill.BillID, Duty.TaskTime
FROM Invoice AS Bill
LEFT OUTER JOIN Duty ON Duty.JobID = Bill.JobID
JOIN Customer ON Customer.CustomerID = Bill.CustomerID
JOIN Job ON // Well, something...We don't know.
我强烈建议你花一些时间阅读和学习优秀的Wikipedia entry on SQL JOINs。祝你好运~