1

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

我正在运行以下查询,这是非常简单的 IMO,但我收到了一个错误。

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

我收到以下错误:

消息 4104,级别 16,状态 1,行 1 无法绑定多部分标识符“P.PeriodId”。

如果我删除 LEFT JOIN,则查询有效。但是,我需要 LEFT JOIN,因为我需要从其他表中提取更多信息。

我究竟做错了什么?有更好的方法吗?

4

2 回答 2

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
于 2010-07-12T14:00:46.163 回答
2

您不能组合隐式和显式连接 -请参阅此运行示例

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​
于 2010-07-12T18:29:58.747 回答