日期:2014-05-18 浏览次数:20869 次
select
姓名,
B.名称,
C .名称
from A
left join B on B.代码 = A.A代码 and B.类型 ='A代码'
left join B C on C.代码 = A.B代码 and C.类型 ='B代码'
------解决方案--------------------
SELECT A.姓名,B.名稱,C.名稱
FROM A表 A LEFT JOIN B表 B ON A.A代碼=B.代碼 AND B.類型='A類型'
LEFT JOIN B表 C ON A.A代碼=c.代碼 AND C.類型='B類型'
------解决方案--------------------
--> liangCK小梁 于2008-11-07
--> 生成测试数据: @T1
DECLARE @T1 TABLE (姓名 VARCHAR(2),A代码 INT,B代码 INT)
INSERT INTO @T1
SELECT '王',1,1 UNION ALL
SELECT '李',1,2 UNION ALL
SELECT '张',2,5
--> 生成测试数据: @T2
DECLARE @T2 TABLE (类型 VARCHAR(5),代码 INT,名称 VARCHAR(4))
INSERT INTO @T2
SELECT 'A代码',1,'男' UNION ALL
SELECT 'A代码',2,'女' UNION ALL
SELECT 'B代码',1,'北京' UNION ALL
SELECT 'B代码',2,'上海' UNION ALL
SELECT 'B代码',5,'广州'
--SQL查询如下:
SELECT a.姓名,b.名称 AS 性别,c.名称 AS 地点
FROM @T1 AS a
JOIN @T2 AS b
ON a.A代码=b.代码
AND b.类型='A代码'
JOIN @T2 AS c
ON a.B代码=c.代码
AND c.类型='B代码'
/*
姓名 性别 地点
---- ---- ----
王 男 北京
李 男 上海
张 女 广州
(3 行受影响)
*/
------解决方案--------------------
这设计确实糟糕。
如果死不悔改的话, case 应该可以解决问题:
select DISTINCT A.name, (case when B.type = 'A' and A.sex = B.code then B.description) as sex,
(case when B.type = 'B' then ...
from A, B
------解决方案--------------------
select 姓名,b1.名称,b2.名称
from A
inner join B b1 on A.A代码=b1.代码 and b1.类型=A代码
inner join B b2 on A.B代码=b2.代码 and b2.类型=B代码
------解决方案--------------------
inner join
------解决方案--------------------
if object_id('a')is not null
drop table a
if object_id('b')is not null
drop table b
go
create table b (类型 varchar(8),代码 int,名称 varchar(4))
insert into b select 'A代码',1,'男'
union all select 'A代码',2,'女'
union all select 'B代码',1,'北京'
union all select 'B代码',2,'上海'
union all select 'B代码',5,'广州'
create table a (姓名 varchar(2),A代码 int,B代码 int)
insert into a select '王',1,1
union all select '李',1,2
union all select '张',2,5
select c.姓名,性别=max(case when b.类型='A代码' then 名称 else '' end),
地址=max(case when b.类型='B代码' then 名称 else '' end) from b join
(select 姓名,类型,代码 from a unpivot(代码 for 类型 in (A代码,B代码)) t1) c
on b.代码=c.代码
group by c.姓名
张 女 上海
王 男 北京
李 女 上海
------解决方案--------------------