-3

単一の内部結合とクロス結合を使用するクエリを作成するタスクがあります。同じ結果を返すはずの、私がすでに書いたクエリは次のようになります。

SELECT T.PRICE, S.ROW, S.NUMBER, M.TITLE  
FROM 
[cinema_no_keys].[dbo].[TICKET] T cross join 
[cinema_no_keys].[dbo].[MOVIE] M cross join 
[cinema_no_keys].[dbo].[SEAT] S cross join 
[cinema_no_keys].[dbo].[SHOW] SH
WHERE
T.ID_SEAT = S.ID_SEAT AND
M.ID_MOVIE = SH.ID_MOVIE AND
SH.DATE_HOUR = T.DATE_HOUR
4

1 に答える 1

6

cross joinの特殊なケースですinner join。条件のない内部結合です。つまり、テーブルのすべての行を結合します。それが存在する唯一の理由は、 のようなばかげたステートメントを書く必要がないようにするためですinner join TABLE on 1=1

すべての行を結合する場合にのみ、クロス結合を使用する必要があります。それを使用してから、whereどの行が一致するかを指定する句に条件を含めることは意味がありません(あなたが行っているように)。

これを行う適切な方法は useであり、句ではなく句でinner join結合条件を指定します。これにより、クエリがより論理的なフローになり、多くの場合、より効率的になります (結果から行を除外するのが早ければ早いほど、クエリの実行は速くなります)。onwhere

を使用する改訂されたクエリを次に示しますinner join

select T.PRICE, S.ROW, S.NUMBER, M.TITLE  
    from [cinema_no_keys].[dbo].[TICKET] T 
    inner join [cinema_no_keys].[dbo].[SEAT] S on
        T.ID_SEAT = S.ID_SEAT
    inner join [cinema_no_keys].[dbo].[SHOW] SH on
        SH.DATE_HOUR = T.DATE_HOUR
    inner join [cinema_no_keys].[dbo].[MOVIE] M on
        M.ID_MOVIE = SH.ID_MOVIE

結合の順序を変更しました。movieのフィールドへのリンクは のshowshowに来る必要があるためmovieです。

于 2013-04-23T12:20:53.197 に答える