我有一个问题,最好的方法是返回多对多关系表另一端的相关表中的一段数据。在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