2014-09-24 5 views
0

Мне нужно избавиться от моего запроса iSeries по подзапросам. В нижеприведенном запросе мне нужно получить ALADD1 и ALADD2 (адреса 1 и 2) из ​​F0116, сопоставленные как на ABAN8, так и на MAPA8, в одну запись. ABAN8 - это идентификатор адреса доставки, а MAPA8 - идентификатор платежного адреса. F0116 содержит значения для этих идентификаторов адресов.Присоединиться и подзаголовки

Текущий запрос:

SELECT T1.ABAN8,T2.MAPA8,T3.ALADD1,T3.ALADD2, 
(SELECT ALADD1 FROM F0116 WHERE MAPA8 = ALAN8) AS ALADD101, 
(SELECT ALADD2 FROM F0116 WHERE MAPA8 = ALAN8) AS ALADD201 
FROM F0101 T1 
LEFT JOIN F0150 T2 ON ABAN8 = MAAN8 
LEFT JOIN F0116 T3 ON ABAN8 = ALAN8 

Результат выглядит следующим образом:

ABAN8, MAPA8, ALADD1,    ALADD2,  ALADD101,   ALADD201, 
100, 200, 555 SHIPPING STR, SUITE B, 555 BILLING STR, SUITE C, 
101, 201, 556 SHIPPING STR, SUITE B, 556 BILLING STR, SUITE C, 
102, 202, 557 SHIPPING STR, SUITE B, 557 BILLING STR, SUITE C 

Но это очень упрощенный пример. На самом деле существует шесть полей адреса, поэтому эффективность ужасна. Как я могу выполнить это без подзапросов для каждого из полей адреса 2?

Заранее спасибо.

ответ

1

Поскольку вы действительно не включили схему, и имена не помогают вообще, я просто сделал пару предположений о том, какие поля делают что (они, вероятно, ошибаются).

Вы можете просто добавить таблицу во второй раз в LEFT JOIN, и тянуть адресов, так, как это:

SELECT 
    T1.ABAN8 
    ,T2.MAPA8 
    ,SHIP.ALADD1 
    ,SHIP.ALADD2 
    ,BILL.ALADD1 
    ,BILL.ALADD2 
FROM F0101 T1 
LEFT JOIN F0150 T2 
    ON T1.ABAN8 = T2.MAAN8 
LEFT JOIN F0116 AS SHIP 
    ON T1.ABAN8 = SHIP.ALAN8 
LEFT JOIN F0116 AS BILL 
    ON T1.ABAN8 = BILL.ALAN8 
+0

Это один! Спасибо, @bhamby! Это сработало: 'SELECT T1.ABAN8, T2.MAPA8, T3.ALADD1, T3.ALADD2, T4.ALADD1 AS ALADD101, T4.ALADD2 AS ALADD201 ОТ F0101 T1 LEFT JOIN F0150 T2 ON T1.ABAN8 = T2.MAAN8 LEFT JOIN F0116 T3 ON T1.ABAN8 = T3.ALAN8 LEFT JOIN F0116 T4 ON T2.MAPA8 = T4.ALAN8' – Adam

+0

Кроме того, следует отметить, что я использовал только «LEFT JOIN», потому что не был уверен, каждая запись в главной таблице гарантировала наличие строки в таблице адресов. Если у них всегда есть строка во вторичной таблице, вы можете изменить ее на обычный (внутренний) 'JOIN'. – bhamby

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