SQL Server的JOIN是支持使用小括號修改執行順序的
阿新 • • 發佈:2019-04-22
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是支持使用小括號修改執行順序的