【问题标题】:Left Join With Multiple results具有多个结果的左连接
【发布时间】:2016-09-03 05:50:48
【问题描述】:

我有一个类似这样的查询:

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 个左连接并获取所有属性?

【问题讨论】:

  • 我想,你在做同样的事情。这是为什么呢?

标签: sql oracle join left-join


【解决方案1】:

如果我的理解是正确的,那么您可以通过以下方式获得所需的结果:

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)

【讨论】:

  • 此查询将结果行相乘。需要group bymax/min/sum
【解决方案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

或者(“轻量级”版本,gorup by 中的列表较少。但优化可能有问题):

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")
)

【讨论】:

  • 谢谢迈克!这正是我想要的!对每个查询的性能有何评论?我倾向于使用支点方法。
  • @user1292124 性能取决于许多因素。我一直在慢慢地写下这个想法的第二个请求。但是,如果在“属性”中,几乎所有在 (1.2) 中具有 PROPERTY_ID 的记录 - 都可以比第一个查询更快。另一方面,来自 Oracle 的优化器很聪明,他可以将所有 3 个查询导致一个单一的计划。最好直接在数据上查看执行计划
【解决方案3】:
Select i.*, GROUP_CONCAT(prop.VALUE) as PROPERTY_VALUE
From ITEM i
Left Join ITEM_PROPERTY prop on i.ITEM_ID = prop.ITEM_D 

【讨论】:

  • 这对 Oracle 无效
【解决方案4】:
 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) 

【讨论】:

    猜你喜欢
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多