【问题标题】:Sql subquery for DB2DB2 的 Sql 子查询
【发布时间】:2015-05-15 06:19:23
【问题描述】:

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

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)

【问题讨论】:

  • 另外,我忘了提到:P,我想根据条件查看子办事处,以及它们对应的总部名称(如在选择子查询中给出的)

标签: sql subquery correlated-subquery


【解决方案1】:

在 SQL 中,使用 JOIN 将基于共同列的表“合并”在一起。

这是一个简单的指南,可以为您提供基本思路: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

在查询中,您在“FROM”之后和“WHERE”之前放置一个 JOIN:

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';

有几种 JOIN 类型(LEFT/RIGHT/INNER/OUTER),所以看看你使用的是你需要的。

【讨论】:

  • 其实我不想显示major_org_number,而是它的名字..在org_name中..我不知道该怎么做..
  • 我已根据您的评论更改了答案。这就是你要找的东西?
  • 太棒了! p.s.如果答案解决了您的问题,请将其标记为已解决
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 2016-10-07
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 2012-12-11
相关资源
最近更新 更多