左外连接上的SQL排除和移动列

时间:2010-12-07 21:23:44

标签: sql sql-server sql-server-2005 tsql sql-server-2008

考虑2个表

id  name
--------
1   abc
2   xyz
3   pqr

表2:

id  type  name  title  fid
------------------------------------
1   123   qwer    mng   1
2   234   asdf    mng   1
3   234   asdfe   mng   2
1   123   qwert   mng   3

现在我查询数据时

DECLARE @table1 table (id int, name varchar(10))
INSERT INTO @table1
SELECT 1, 'abc'
UNION
SELECT 2, 'pqr'
UNION
SELECT 3, 'zxc'

DECLARE @table2 table (id int, name varchar(10), etype int, title varchar(10), fid int)
INSERT INTO @table2
SELECT 1, 'qwer', 123, 'mngr', 1
UNION
SELECT 2, 'asdf', 234, 'mngr', 1
UNION
SELECT 3, 'asdfe', 234, 'mngr', 2
UNION
SELECT 1, 'qwert', 123, 'mngr', 3



SELECT t1.Name as Emp, t2.name as Mg1, t2.title As Title1, t3.name as Mg2, t3.title as Title2
FROM @table1 t1
LEFT OUTER JOIN @table2 t2 ON t1.id = t2.fid AND t2.etype = 123
LEFT OUTER JOIN @table2 t3 ON t1.id = t3.fid AND t3.etype = 234

我想更改此查询,以便从

更改结果
Emp        Mg1        Title1     Mg2        Title2
---------- ---------- ---------- ---------- ----------
abc        qwer       mngr       asdf       mngr
pqr        NULL       NULL       asdfe      mngr
zxc        qwert      mngr       NULL       NULL

Emp        Mg1        Title1     Mg2        Title2
---------- ---------- ---------- ---------- ----------
abc        qwer       mngr       asdf       mngr
pqr        asdfe      mngr
zxc        qwert      mngr       

不确定我是如何实现这一点的?

1 个答案:

答案 0 :(得分:1)

SELECT t1.Name as Emp, 
       coalesce(t2.name,t3.name) as Mg1, coalesce(t2.title,t3.title) As Title1, 
       case when t2.name is not null then coalesce(t3.name,'') else '' end as Mg2, 
       case when t2.title is not null then coalesce(t3.title,'') else '' end as Title2
FROM @table1 t1
LEFT OUTER JOIN @table2 t2 ON t1.id = t2.fid AND t2.etype = 123
LEFT OUTER JOIN @table2 t3 ON t1.id = t3.fid AND t3.etype = 234