db2 使用EXIST(或NOT EXIST)或两者的组合构建列表的SQL

im9ewurl  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(312)

我想在USER表中查找公司ID/用户ID组合的列表,这些组合在ACCOUNT表中至少有一个帐户,但所有帐户都已关闭。(如果公司ID/用户ID没有帐户(在帐户上)(在USER上),则不应出现在结果中)。如果只有一个CompanyID/UserID的帐户(在USER上)为OPEN(在ACCOUNT表上),则公司ID/用户ID不应在列表中。
在下面的示例中,ABC/USER 3是唯一符合此条件的组合。它有2个帐户(333和666),并且都已关闭。其余的公司标识/用户标识组合至少有1个“帐户”为“未结”。DDD/USER 5被排除在外,因为888不在"帐户“表中。
表:用户
| 公司ID|用户ID|客户|
| - -|- -|- -|
| 美国汽车协会|用户1|一一一|
| 美国汽车协会|用户1|三百三十三个|
| ABB公司|用户2|三百三十三个|
| ABB公司|用户2|四百四十四|
| ABC公司|用户3|三百三十三个|
| ABC公司|用户3|六百六十六|
| 血脑屏障|用户4|五五五|
| CCC认证|用户4|六百六十六|
| 限定日|用户5|八百八十八|
表:账户
| 客户|状态|
| - -|- -|
| 一一一|未结|
| 二百二十二人|未结|
| 三百三十三个|已关闭|
| 四百四十四|未结|
| 五五五|未结|
| 六百六十六|已关闭|
| 小行星七百七十七|未结|
我用表名编写了最初的问题,我认为这样会更容易理解(而不是我使用的实际DB2表)NB002.NBTBAUTH(是USERS)NB002.NBTBMF(是ACCOUNT)
这是我尝试使用的SQL:

SELECT NB002.NBTBAUTH.*, Q.USERID, Q.CNTOPEN
FROM NB002.NBTBAUTH LEFT JOIN (SELECT NB002.NBTBAUTH.USERID,
COUNT(IF(NB002.NBTBMF.ACCOUNTSTATUS = 'OPEN',1,NULL)) AS CNTOPEN 
FROM USERS INNER JOIN NB002.NBTBMF ON NB002.NBTBAUTH.ACCOUNTID
     = NB002.NBTBMF.ACCOUNTID
GROUP BY USERID) AS Q ON NB002.NBTBAUTH.USERID = Q.USERID
WHERE NOT Q.USERID IS NULL AND Q.CNTOPEN = 0;

错误消息:
SQLCODE -104非法符号“="。
是第一个=引起的,我把它改成了〈,〈也得到了同样的消息。

zvokhttg

zvokhttg1#

/*
WITH 
  USERS (COMPANYID, USERID, ACCOUNT) AS
(
          SELECT 'AAA', 'USER1', '111' FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'AAA', 'USER1', '333' FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'ABB', 'USER2', '333' FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'ABB', 'USER2', '444' FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'ABC', 'USER3', '333' FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'ABC', 'USER3', '666' FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'BBB', 'USER4', '555' FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'CCC', 'USER4', '666' FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'DDD', 'USER5', '888' FROM SYSIBM.SYSDUMMY1
)
, ACCOUNTS (ACCOUNT, STATUS) AS
(
          SELECT '111', 'OPEN'   FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT '222', 'OPEN'   FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT '333', 'CLOSED' FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT '444', 'OPEN'   FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT '555', 'OPEN'   FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT '666', 'CLOSED' FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT '777', 'OPEN'   FROM SYSIBM.SYSDUMMY1
)

* /

SELECT U.USERID
FROM USERS U
JOIN ACCOUNTS A ON A.ACCOUNT = U.ACCOUNT
GROUP BY U.USERID
HAVING COUNT (1) = COUNT (CASE A.STATUS WHEN 'CLOSED' THEN 1 END)

| 用户ID|
| - -|
| 用户3|
不清楚USER标识符是什么-是USERID还是(COMPANYID, USERID)。如果是后者,则将U.COMPANYID添加到GROUP BYSELECT中。

相关问题