2010-07-12 108 views
0

是否可以在2个表之间进行CROSS JOIN,然后是左连接到第3个表,然后是可能更多的左连接?我正在使用SQL Server 2000/2005。交叉连接,然后是左连接

我正在运行以下查询,这是非常straightforward国际海事组织,但我得到一个错误。

select P.PeriodID, 
     P.PeriodQuarter, 
     P.PeriodYear, 
     M.Name, 
     M.AuditTypeId, 
     A.AuditId 
from Period P, Member M 

LEFT JOIN Audits A 
ON P.PeriodId = A.PeriodId 

WHERE 
    P.PeriodID > 29 AND P.PeriodID < 38 
    AND M.AuditTypeId in (1,2,3,4) 
order by M.Name 

我收到以下错误:

Msg 4104, Level 16, State 1, Line 1 The multi-part identifier "P.PeriodId" could not be bound.

如果我删除了LEFT JOIN的查询工作。但是,我需要LEFT JOIN,因为我需要从其他表格中提取更多信息。

我在做什么错?有没有更好的方法呢?

回答

1

不能同时使用隐性和显性加入 - see this running example

CROSS JOIN应该在系统中很少使用,我希望每个人都是明确的,以确保它显然不是编码错误或设计错误。

如果你想要做一个隐含的左外连接,做到这一点(不支持SQL Azure的):

select P.PeriodID, 
     P.PeriodQuarter, 
     P.PeriodYear, 
     M.Name, 
     M.AuditTypeId, 
     A.AuditId 
from #Period P, #Member M, #Audits A 
WHERE 
    P.PeriodID > 29 AND P.PeriodID < 38 
    AND M.AuditTypeId in (1,2,3,4) 
    AND P.PeriodId *= A.PeriodId 
order by M.Name​ 
+0

Thnx。这使得我现在更清楚了。做一个交叉连接是我能想到解决我的特殊问题的唯一方法。 '* ='操作符虽然做了什么? – 2010-07-13 07:43:22

+0

@Saajid Imsail * =是隐式联接的旧式LEFT JOIN运算符。 – 2010-07-13 13:56:13

+0

该运算符不可靠且不被使用,正确的修复方法是使用显式连接。没有任何理由不在任何查询中使用显式连接。 – HLGEM 2011-09-02 17:25:35

5

你忘了CROSS JOIN在查询:

select P.PeriodID, 
     P.PeriodQuarter, 
     P.PeriodYear, 
     M.Name, 
     M.AuditTypeId, 
     A.AuditId 
from Period P CROSS JOIN Member M 

LEFT JOIN Audits A 
ON P.PeriodId = A.PeriodId 

WHERE 
    P.PeriodID > 29 AND P.PeriodID < 38 
    AND M.AuditTypeId in (1,2,3,4) 
order by M.Name 
+0

我并不需要指定它,据我所知。查询工作正常,如果我删除LEFT JOIN审计表。从我读过的,我的OP定义了一个隐式交叉连接。 – 2010-07-12 14:19:43

+0

好,所以我试过你的代码,现在它可以工作..但为什么?这没有意义。 – 2010-07-12 14:21:07

+0

@Saajid:SQL趋于一次查看整个子句。例如,你不能说'select a + b as c,2 * c as double_c'因为'c'在select子句开始时没有定义。混合旧式和新式连接时会发生同样的事情。 from子句中的逗号之间的各个部分都被查看,就像在parellel中一样。因此,在逗号左侧定义的P没有出现在右侧。另见示例,请参阅http://stackoverflow.com/questions/1080097/the-multi-part-identifier-could-not-be-bound-on-sql-server-2005-8/1080407#1080407。 – 2010-07-12 20:54:06