【发布时间】:2010-06-09 13:02:22
【问题描述】:
我有一个关于返回多对多关系表另一侧相关表中的数据的最佳方法的问题。
我的第一个方法是使用join来取回数据,但是由于关系表中有多个匹配的行,我不得不使用一个TOP 1来获得单行结果。
我的第二种方法使用子查询来获取数据,但这感觉不对。
所以,我的问题是,哪个是首选方法,还是有更好的方法?
创建测试表、插入数据和运行两个查询所需的脚本如下。
感谢您的建议!
达维斯
创建表格
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)
获取结果 - 方法一
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 列总是按顺序上升。这不能保证。
标签: sql-server join subquery