日期:2014-05-18  浏览次数:20510 次

关于一个中间表的查询
表A:工作
id name
1 工作A
2 工作B
3 工作C

表B:文档
id name 版本 创建日期
1 文档A A1 2012-7-20
2 文档A A2 2012-7-21
3 文档A A3 2012-7-21
4 文档B B1 2012-7-21

表C:中间表(id1:工作id,id2:文档id)
id id1 id2 
1 1 1  
2 1 2  
3 1 3  
4 2 4


希望得到的结果是:
id name 文档id 文档name 版本 文档创建日期
1 工作A 3 文档A A3 2012-7-21
2 工作B 4 文档B B1 2012-7-21
3 工作C

------解决方案--------------------
SQL code
SELECT A.id,A.name,B.id,B.name,B.版本,B.创建日期
FROM 表A AS A
LEFT JOIN 表C AS C ON A.id = C.id1
LEFT JOIN 表B AS B ON B.id = C.id2

------解决方案--------------------
SQL code
--> 测试数据:[工作]
IF OBJECT_ID('[工作]') IS NOT NULL DROP TABLE [工作]
GO
CREATE TABLE [工作]([id] INT,[name] VARCHAR(5))
INSERT [工作]
SELECT 1,'工作A' UNION ALL
SELECT 2,'工作B' UNION ALL
SELECT 3,'工作C'
GO


--> 测试数据:[文档]
IF OBJECT_ID('[文档]') IS NOT NULL DROP TABLE [文档]
GO
CREATE TABLE [文档]([id] INT,[name] VARCHAR(5),[版本] VARCHAR(2),[创建日期] DATETIME)
INSERT [文档]
SELECT 1,'文档A','A1','2012-7-20' UNION ALL
SELECT 2,'文档A','A2','2012-7-21' UNION ALL
SELECT 3,'文档A','A3','2012-7-21' UNION ALL
SELECT 4,'文档B','B1','2012-7-21'
GO

--> 测试语句:
--> 测试数据:[中间表]
IF OBJECT_ID('[中间表]') IS NOT NULL DROP TABLE [中间表]
GO
CREATE TABLE [中间表]([id] INT,[id1] INT,[id2] INT)
INSERT [中间表]
SELECT 1,1,1 UNION ALL
SELECT 2,1,2 UNION ALL
SELECT 3,1,3 UNION ALL
SELECT 4,2,4
GO

--> 测试语句:
SELECT * FROM [工作] a
left join [中间表] b on a.[id]=b.[id1] 
left join [文档] c on b.[id2]=c.[id]
where not exists(select 1 from [中间表] where [id1]=b.[id1] and [id]>b.[id])
/*
id          name  id          id1         id2         id          name  版本   创建日期
----------- ----- ----------- ----------- ----------- ----------- ----- ---- -----------------------
1           工作A   3           1           3           3           文档A   A3   2012-07-21 00:00:00.000
2           工作B   4           2           4           4           文档B   B1   2012-07-21 00:00:00.000
3           工作C   NULL        NULL        NULL        NULL        NULL  NULL NULL

(3 行受影响)

*/