日期:2014-05-18 浏览次数:20767 次
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.姓名 张 女 上海 王 男 北京 李 女 上海
------解决方案--------------------