左连接多个结果

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)