我有一個問題,最好的方法是返回多對多關係表另一端的相關表中的一段數據。在SQL語句中返回相關數據的最佳方法
我的第一個方法使用連接返回數據,但由於關係表中有多個匹配的行,我不得不使用TOP 1來獲得單行結果。
我的第二種方法使用子查詢來獲取數據,但這只是感覺不對。
所以,我的問題是,哪個是首選方法,還是有更好的方法?
下面是創建測試表,插入數據和運行兩個查詢所需的腳本。
感謝您的諮詢!
Darvis
創建表
DECLARE @TableA TABLE (
[A_ID] [int] IDENTITY(1,1) NOT NULL,
[Description] [varchar](50) NULL)
DECLARE @TableB TABLE (
[B_ID] [int] IDENTITY(1,1) NOT NULL,
[A_ID] [int] NOT NULL,
[Description] [varchar](50) NOT NULL)
DECLARE @TableC TABLE (
[C_ID] [int] IDENTITY(1,1) NOT NULL,
[Description] [varchar](50) NOT NULL)
DECLARE @TableB_C TABLE (
[B_ID] [int] NOT NULL,
[C_ID] [int] NOT NULL)
插入測試數據
INSERT INTO @TableA VALUES('A-One')
INSERT INTO @TableA VALUES('A-Two')
INSERT INTO @TableA VALUES('A-Three')
INSERT INTO @TableB (A_ID, Description) VALUES(1,'B-One')
INSERT INTO @TableB (A_ID, Description) VALUES(1,'B-Two')
INSERT INTO @TableB (A_ID, Description) VALUES(1,'B-Three')
INSERT INTO @TableB (A_ID, Description) VALUES(2,'B-Four')
INSERT INTO @TableB (A_ID, Description) VALUES(2,'B-Five')
INSERT INTO @TableB (A_ID, Description) VALUES(3,'B-Six')
INSERT INTO @TableC VALUES('C-One')
INSERT INTO @TableC VALUES('C-Two')
INSERT INTO @TableC VALUES('C-Three')
INSERT INTO @TableB_C (B_ID, C_ID) VALUES(1, 1)
INSERT INTO @TableB_C (B_ID, C_ID) VALUES(2, 1)
INSERT INTO @TableB_C (B_ID, C_ID) VALUES(3, 1)
獲取結果 - 方法1
SELECT TOP 1 C.*, A.Description
FROM @TableC C
JOIN @TableB_C BC ON BC.C_ID = C.C_ID
JOIN @TableB B ON B.B_ID = BC.B_ID
JOIN @TableA A ON B.A_ID = A.A_ID
WHERE C.C_ID = 1
獲取結果 - 方法2
SELECT C.*,
(SELECT A.Description
FROM @TableA A
WHERE EXISTS (SELECT *
FROM @TableB_C BC
JOIN @TableB B ON B.B_ID = BC.B_ID
WHERE BC.C_ID = C.C_ID AND B.A_ID = A.A_ID))
FROM @TableC C
WHERE C.C_ID = 1
您應該小心計數IDENTITY列以始終順序上升。這不能保證。 – 2010-06-09 14:16:56