2015-05-15 207 views
1

sql查询需要连接4个表,我这样做了,而且我必须显示满足条件的几列。假设这是Where子句中的查询。现在,我该如何编写一个子查询...来显示其内容基于Where子句中的查询所满足的行的另一列(ORG_NAME,ORG_UNIT中有)。 我写了这个代码,但它不是为我工作:DB2的SQL子查询

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 

在查询中,你把后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, 
    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'; 

有多种连接类型(左/右/内/外),所以看你使用你需要的。

+0

其实我不想显示major_org_number,而不是它的名字..这是在org_name ..我不知道该怎么做.. –

+0

我已经根据你的评论改变了答案。那是你在找什么? –

+0

行..有.. ..谢谢.. :) –