1. 程式人生 > >SQL Server的JOIN是支持使用小括號修改執行順序的

SQL Server的JOIN是支持使用小括號修改執行順序的

rec create 現在 clust ont dup image with 執行順序

假如現在我們的SQL Server數據庫中有三個表:[T_A]、[T_B]和[T_C],它們的建表語句如下:

--建表語句[T_A]
CREATE TABLE [dbo].[T_A](
    [ID_A] [INT] NOT NULL,
 CONSTRAINT [PK_T_A] PRIMARY KEY CLUSTERED 
(
    [ID_A] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS =
ON) ON [PRIMARY] ) ON [PRIMARY]; --建表語句[T_B] CREATE TABLE [dbo].[T_B]( [ID_B] [INT] NOT NULL, CONSTRAINT [PK_T_B] PRIMARY KEY CLUSTERED ( [ID_B] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY
] ) ON [PRIMARY]; --建表語句[T_C] CREATE TABLE [dbo].[T_C]( [ID_C] [INT] NOT NULL, CONSTRAINT [PK_T_C] PRIMARY KEY CLUSTERED ( [ID_C] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY
];

[T_A]、[T_B]和[T_C]每個表都只有一個INT類型的列,我們使用下面的語句給這三個表插入數據:

INSERT INTO [dbo].[T_A]
VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);

INSERT INTO [dbo].[T_B]
VALUES (1),(2),(3),(4),(5);

INSERT INTO [dbo].[T_C]
VALUES (1),(2),(3);

我們都知道默認情況下,SQL Server中的JOIN語句都是按表出現的順序執行的,例如下面的SELECT語句中,SQL Server會先執行表[T_A]和[T_B]之間的LEFT JOIN,然後再執行表[T_B]和[T_C]之間的INNER JOIN:

SELECT *
FROM
[dbo].[T_A]
LEFT JOIN
[dbo].[T_B]
ON
[T_A].ID_A=[T_B].ID_B
INNER JOIN
[dbo].[T_C]
ON
[T_B].ID_B=[T_C].ID_C

執行結果:

技術分享圖片

由於上面的SELECT語句中,最後INNER JOIN了表[T_C],所以最後查詢結果肯定和表[T_C]的數據行數一致,只有三行。

那麽在上面的SELECT語句中,我們能不能在不調整表順序的情況下,讓SQL Server先執行表[T_B]和[T_C]之間的INNER JOIN,再執行表[T_A]和[T_B]之間的LEFT JOIN呢,因為這樣的話,由於最後執行的是表[T_A]的LEFT JOIN,所以我們就可以在查詢結果中保留表[T_A]的所有數據。

答案是可以的,我們要給表[T_B]和[T_C]之間的INNER JOIN加上小括號:

SELECT *
FROM
[dbo].[T_A]
LEFT JOIN
(
    [dbo].[T_B]
    INNER JOIN
    [dbo].[T_C]
    ON
    [T_B].ID_B=[T_C].ID_C
)
ON
[T_A].ID_A=[T_B].ID_B

執行結果:

技術分享圖片

由於現在我們給表[T_B]和[T_C]之間的INNER JOIN加上了小括號,所以SQL Server會先執行小括號內的INNER JOIN,再執行小括號外的LEFT JOIN,這樣我們就在查詢結果中保留了表[T_A]的所有數據。

因此我們可以看到,SQL Server的JOIN是支持通過小括號來改變表與表之間的執行順序的,通過小括號我們可以讓JOIN按照我們想要的順序來執行。

SQL Server的JOIN是支持使用小括號修改執行順序的