左连接多个结果
Left Join With Multiple results
我有这样的查询:
Select i.*, prop1.VALUE as PROPERTY_ONE, prop2.VALUE as PROPERTY_TWO
From ITEM i
Left Join ITEM_PROPERTY prop1 on i.ITEM_ID = prop1.ITEM_D and prop1.PROPERTY_ID = 1
Left Join ITEM_PROPERTY prop2 on i.ITEM_ID = prop2.ITEM_D and prop2.PROPERTY_ID = 2
有什么方法可以只用1个left join就得到所有的属性吗?
Select i.*, GROUP_CONCAT(prop.VALUE) as PROPERTY_VALUE
From ITEM i
Left Join ITEM_PROPERTY prop on i.ITEM_ID = prop.ITEM_D
如果我的理解是正确的,那么您可以通过以下方式获得想要的结果:
SELECT i.*,
CASE WHEN prop1.PROPERTY_ID = 1 THEN prop1.VALUE ELSE '' END AS PROPERTY_ONE,
CASE WHEN prop1.PROPERTY_ID = 2 THEN prop1.VALUE ELSE '' END AS PROPERTY_TWO
FROM ITEM i
LEFT JOIN ITEM_PROPERTY prop1 on i.ITEM_ID = prop1.ITEM_D
AND prop1.PROPERTY_ID IN (1, 2)
旧样式:
Select i.*,
max(decode(prop.PROPERTY_ID,1,prop.VALUE,NULL)) as PROPERTY_ONE,
max(decode(prop.PROPERTY_ID,2,prop.VALUE,NULL)) as PROPERTY_TWO
From ITEM i
Left Join ITEM_PROPERTY prop on i.ITEM_ID = prop.ITEM_D and prop.PROPERTY_ID in(1,2)
group by there_will_have_to_list_all_the_fields_from_ITEM
或者("light"版本,group by中少了list。不过可能优化有问题):
Select i.*,prop.PROPERTY_ONE,prop.PROPERTY_TWO
From ITEM i
Left Join (
select ITEM_ID,
max(decode(PROPERTY_ID,1,VALUE,NULL)) as PROPERTY_ONE,
max(decode(PROPERTY_ID,2,VALUE,NULL)) as PROPERTY_TWO
from ITEM_PROPERTY
where PROPERTY_ID in(1,2)
group by ITEM_ID
) prop on i.ITEM_ID = prop.ITEM_D
新样式(Oracle 11g+):
select * from (
Select i.*, prop.PROPERTY_ID, prop1.VALUE
From ITEM i
Left Join ITEM_PROPERTY prop on i.ITEM_ID = prop.ITEM_D and prop.PROPERTY_ID in(1,2)
)
pivot(
max(VALUE) for PROPERTY_ID in(1 as "PROPERTY_ONE",2 as "PROPERTY_TWO")
)
Select i.*, prop1.VALUE as PROPERTY_ONE, prop2.VALUE as PROPERTY_TWO
From ITEM i
Left Join ITEM_PROPERTY prop on i.ITEM_ID = prop.ITEM_D and prop.PROPERTY_ID in (1,2)
我有这样的查询:
Select i.*, prop1.VALUE as PROPERTY_ONE, prop2.VALUE as PROPERTY_TWO
From ITEM i
Left Join ITEM_PROPERTY prop1 on i.ITEM_ID = prop1.ITEM_D and prop1.PROPERTY_ID = 1
Left Join ITEM_PROPERTY prop2 on i.ITEM_ID = prop2.ITEM_D and prop2.PROPERTY_ID = 2
有什么方法可以只用1个left join就得到所有的属性吗?
Select i.*, GROUP_CONCAT(prop.VALUE) as PROPERTY_VALUE
From ITEM i
Left Join ITEM_PROPERTY prop on i.ITEM_ID = prop.ITEM_D
如果我的理解是正确的,那么您可以通过以下方式获得想要的结果:
SELECT i.*,
CASE WHEN prop1.PROPERTY_ID = 1 THEN prop1.VALUE ELSE '' END AS PROPERTY_ONE,
CASE WHEN prop1.PROPERTY_ID = 2 THEN prop1.VALUE ELSE '' END AS PROPERTY_TWO
FROM ITEM i
LEFT JOIN ITEM_PROPERTY prop1 on i.ITEM_ID = prop1.ITEM_D
AND prop1.PROPERTY_ID IN (1, 2)
旧样式:
Select i.*,
max(decode(prop.PROPERTY_ID,1,prop.VALUE,NULL)) as PROPERTY_ONE,
max(decode(prop.PROPERTY_ID,2,prop.VALUE,NULL)) as PROPERTY_TWO
From ITEM i
Left Join ITEM_PROPERTY prop on i.ITEM_ID = prop.ITEM_D and prop.PROPERTY_ID in(1,2)
group by there_will_have_to_list_all_the_fields_from_ITEM
或者("light"版本,group by中少了list。不过可能优化有问题):
Select i.*,prop.PROPERTY_ONE,prop.PROPERTY_TWO
From ITEM i
Left Join (
select ITEM_ID,
max(decode(PROPERTY_ID,1,VALUE,NULL)) as PROPERTY_ONE,
max(decode(PROPERTY_ID,2,VALUE,NULL)) as PROPERTY_TWO
from ITEM_PROPERTY
where PROPERTY_ID in(1,2)
group by ITEM_ID
) prop on i.ITEM_ID = prop.ITEM_D
新样式(Oracle 11g+):
select * from (
Select i.*, prop.PROPERTY_ID, prop1.VALUE
From ITEM i
Left Join ITEM_PROPERTY prop on i.ITEM_ID = prop.ITEM_D and prop.PROPERTY_ID in(1,2)
)
pivot(
max(VALUE) for PROPERTY_ID in(1 as "PROPERTY_ONE",2 as "PROPERTY_TWO")
)
Select i.*, prop1.VALUE as PROPERTY_ONE, prop2.VALUE as PROPERTY_TWO
From ITEM i
Left Join ITEM_PROPERTY prop on i.ITEM_ID = prop.ITEM_D and prop.PROPERTY_ID in (1,2)