2015-05-15 5 views
1

Для запроса sql требуется 4 таблицы, которые я сделал, и я должен отображать несколько столбцов из них, которые удовлетворяют условию. Скажем, что это запрос в разделе Where. Теперь как написать подзапрос .., чтобы отобразить другой столбец (ORG_NAME, который есть в ORG_UNIT), содержимое которого основано на строках, которые были удовлетворены запросом в предложении Where. Я написал этот код, но он не работает для меня:Подзапрос Sql для DB2

SELECT T33.CONTRACT_NUM, T135.MINOR_ORG_NUM, T96.ORG_TYPE,T22.CFD_FLAG, 
    (SELECT T96.ORG_NAME 
    FROM ORG_UNIT T96, SUB_UNIT T135 
    WHERE T96.ORG_NUMBER IN (T135.MAJOR_ORG_NUMBER)) AS HEAD_ORG_NAME 
FROM 
    ORG_UNIT T96, SUB_UNIT T135, CUST_CONTRACT T33, CONT_ASSIGNMT T22 
WHERE 
    T96.ORG_NUMBER = T22.ORG_NUMBER 
    AND T22.CTR_SYS_NUM = T33.CTR_SYS_NUM 
    AND T96.ORG_NUMBER = T135.MINOR_ORG_NUMBER 
    AND T135.RELTN_TYPE = 'HOS' 
    AND T22.CFD_FLAG = 'Y'; 

Для записи, T135 содержит головные офисы числа (MAJOR_ORG_NUMBER) и их суб - офисы числа (MINOR_ORG_NUMBER)

+0

Кроме того, я забыл упомянуть: P, что я хочу видеть суб-офисы в зависимости от состояния и их соответствующих названий головных офисов (как указано в подборе выбора) –

ответ

1

В SQL, использование ПРИСОЕДИНЯЙТЕСЬ "объединить" вместе таблицы на основе их общих столбцов.

Вот простой гид, который даст вам основную идею: SQL JOIN

В SQL, это всегда лучше, чтобы сделать то, что вы хотите сделать, поэтому следует обратиться к этой ссылке, чтобы увидеть «LEFT JOIN» пример изображения : LEFT JOIN

Использование "LEFT JOIN", чтобы объединить таблицы (где: ORG_UNIT.ORG_NUMBER = SUB_UNIT.MAJOR_ORG_NUMBER), будет выглядеть следующим образом:

LEFT JOIN SUB_UNIT T135 ON T96.ORG_NUMBER = T135.MAJOR_ORG_NUMBER 

в запросе, вы поставите РЕГИСТРИРУЙТЕСЬ сразу после «ОТ», и ДО "ГДЕ":

SELECT 
    T33.CONTRACT_NUM, 
    T135.MINOR_ORG_NUM, 
    T96.ORG_TYPE, 
    T22.CFD_FLAG, 
    T135.ORG_NAME AS HEAD_ORG_NAME 
FROM 
    ORG_UNIT T96, 
    CUST_CONTRACT T33, 
    CONT_ASSIGNMT T22 

LEFT JOIN SUB_UNIT T135 ON T96.ORG_NUMBER = T135.MAJOR_ORG_NUMBER 

WHERE 
    T96.ORG_NUMBER = T22.ORG_NUMBER 
    AND T22.CTR_SYS_NUM = T33.CTR_SYS_NUM 
    AND T96.ORG_NUMBER = T135.MINOR_ORG_NUMBER 
    AND T135.RELTN_TYPE = 'HOS' 
    AND T22.CFD_FLAG = 'Y'; 

Обратите внимание, что вы могли бы (и должны) использовать JOIN для объединения всех таблиц (и избежать использования дорогой WHERE условие):

SELECT 
    T33.CONTRACT_NUM, 
    T135.MINOR_ORG_NUM, 
    T96.ORG_TYPE, 
    T22.CFD_FLAG, 
    T135.ORG_NAME AS HEAD_ORG_NAME 

FROM 
    ORG_UNIT T96 

LEFT JOIN SUB_UNIT T135 ON 
    T96.ORG_NUMBER = T135.MAJOR_ORG_NUMBER 
    AND T96.ORG_NUMBER = T135.MINOR_ORG_NUMBER 
LEFT JOIN ON 
    CONT_ASSIGNMT T22 ON T96.ORG_NUMBER = T22.ORG_NUMBER 
LEFT JOIN ON 
    CUST_CONTRACT T33 ON T22.CTR_SYS_NUM = T33.CTR_SYS_NUM 

WHERE 
    T135.RELTN_TYPE = 'HOS' 
    AND T22.CFD_FLAG = 'Y'; 

Есть несколько РЕГИСТРИРУЙТЕСЬ типов (LEFT/RIGHT/INNER/OUTER), так что смотрите, используя тот, который вам нужен.

+0

На самом деле, я не хочу показывать major_org_number, вместо этого его имя .., которое находится в org_name .. я не знаю, как это сделать. –

+0

Я изменил ответ в соответствии с вашим комментарием. это то, что вы ищете? –

+0

ok .. получил .. спасибо .. :) –