Sql DB2 的子查询
Sql subquery for DB2
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)
在 SQL 中,使用 JOIN 以 "merge" 表基于它们的公共列。
这里有一个简单的指南,可以为您提供基本思路:SQL JOIN
在SQL中,想画什么总是最好的,所以参考这个link看一个"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),因此请查看您使用的是您需要的类型。
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)
在 SQL 中,使用 JOIN 以 "merge" 表基于它们的公共列。
这里有一个简单的指南,可以为您提供基本思路:SQL JOIN
在SQL中,想画什么总是最好的,所以参考这个link看一个"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),因此请查看您使用的是您需要的类型。