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 に答える