三表联合查询(横表转竖表,优先查询),该如何解决

三表联合查询(横表转竖表,优先查询)
本帖最后由 chai1338 于 2014-11-26 12:19:45 编辑

表Nop_Customer
CustomerID
     1
     2
     3
     4

表Nop_Address
CustomerID   FirstName     LastName
    1          小           白
    2          小           黑
表Nop_CustomerAttribute
CustomerID         keys          value
    3            FirstName         小
    3            LastName          明
最后想得到的结果是
CustomerID     FirstName     LastName
    1             小             白
    2             小             黑
    3             小             明
    4            null          null
查询的方式是优先级联Nop_CustomerAttribute表 如果 1、2为空则再级联Nop_Address表 如果2个都没有 则为null 或 ' '

我就实现了 两表查询 三表的优先查询不知道该如何实现 


------解决思路----------------------
貌似直接连接一下就可以了
SELECT
T1.CustomerID
,ISNULL(T2.value,T4.FirstName)[FirstName]
,ISNULL(T3.value,T4.LastName)[LastName]
FROM Nop_Customer T1
LEFT JOIN Nop_CustomerAttribute T2 ON T1.CustomerID=T2.CustomerID AND T2.keys='FirstName'
LEFT JOIN Nop_CustomerAttribute T3 ON T1.CustomerID=T3.CustomerID AND T3.keys='LastName'
LEFT JOIN Nop_Address T4 ON T1.CustomerID=T4.CustomerID

------解决思路----------------------


create table Nop_Customer(
customerId int
)

create table Nop_Address(
CustomerId int,
FirstName varchar(20),
LastName varchar(20)
)

create table Nop_CustomerAttribute(
customerId int,
keys varchar(20),
value varchar(20)
)

insert into Nop_Customer
select 1 union all
select 2 union all
select 3 union all
select 4

insert into Nop_Address
select 1,'小','白' union all
select 2,'小','黑'

insert into Nop_CustomerAttribute
select 3,'FirstName','小' union all
select 3,'LastName','明'


select a.CusTomerId,b.FirstName,b.LastName 
from Nop_Customer a 
left outer join
(
select * from Nop_Address union all
select Customerid,
max(case when keys='FirstName' then value else '' end) as FirstName,
max(case when keys='LastName' then value else '' end) as LastName
from
Nop_CustomerAttribute group by CusTomerId 
 ) b 
 on a.CusTomerId=b.CusTomerId 

------解决思路----------------------
引用:
Quote: 引用:


select a.CusTomerId,b.FirstName,b.LastName 
from Nop_Customer a 
left outer join
(
select * from Nop_Address union all
select Customerid,
max(case when keys='FirstName' then value else '' end) as FirstName,
max(case when keys='LastName' then value else '' end) as LastName
from
Nop_CustomerAttribute group by CusTomerId 
 ) b 
 on a.CusTomerId=b.CusTomerId 


使用 UNION、INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有相同数目的表达式


什么意思?是报错吗?不可能吧,我测试是直接出结果的嗫(我的SQLSERVER版本是2014)。。。直接拷贝出来执行:
三表联合查询(横表转竖表,优先查询),该如何解决