2016-09-03 3 views
0

У меня есть что-то вроде этого запроса:Соединение слева с несколькими результатами

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 слева присоединиться и получить все свойства?

+0

Я думаю, вы делаете то же самое. Почему это? –

ответ

0

Старый стиль:

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 

Or ("свет" версия, менее список в Gorup но может возникнуть проблема с оптимизацией):

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

Спасибо, Майк! Это именно то, что я искал! Какие-либо комментарии в отношении производительности для каждого запроса? Я склонялся к основополагающему подходу. – user1292124

+0

@ user1292124 Производительность зависит от многих факторов. Я писал это второй запрос к идее медленно. Но если в «Имуществе» практически все записи с PROPERTY_ID в (1.2) - могут быть быстрее первого запроса. С другой стороны, оптимизатор из Oracle умный, он может сделать все 3 запроса привести к одному плану. Лучше посмотреть планы выполнения непосредственно на свои данные – Mike

0
Select i.*, GROUP_CONCAT(prop.VALUE) as PROPERTY_VALUE 
From ITEM i 
Left Join ITEM_PROPERTY prop on i.ITEM_ID = prop.ITEM_D 
+0

Это неверно для Oracle –

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) 
+0

Этот запрос умножает результирующие строки. Нужна 'группа by' и' max/min/sum' – Mike

0
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) 
+1

Ваш ответ, безусловно, стоит немного пояснить ... –

Смежные вопросы