【问题标题】:Is there a way to create an 'indicator' in an SQL(DB2) select query to indicate when a column is filled?有没有办法在 SQL(DB2) 选择查询中创建一个“指示符”来指示何时填充列?
【发布时间】:2021-01-20 11:41:30
【问题描述】:

这个标题含糊不清,并没有完全涵盖问题,但我不知道该怎么说。基本上我有以下几种情况:

我有两张桌子:

表 1:公司。显示公司父子结构

company parent-company
A NULL
B A
C A
D A
E B

表 2:帐户。与公司关联的帐户

company account-id account-currency
B 1234 EUR
B 5678 GBP
C 7777 EUR

我想要检索输入公司的子公司,为了争论,该公司是 A 公司。在这些子公司中,我想知道是否有任何帐户与它们相关联。我不想知道是哪些,只要有与之关联的帐户即可。

我目前的查询如下:

SELECT * 
FROM COMPANY A
left join ACCOUNTS B
ON A.company = B.company
WHERE A.parent-company = 'A'

这为我提供了与母公司 A 关联的子公司 + 与这些子公司关联的每个帐户。这意味着对于 B 公司,我得到两行,两个帐户。

company parent-company account-id account-currency
B A 1234 EUR
B A 5678 GBP
C A 7777 EUR
D A NULL NULL

如果我在该查询中添加一个 case 语句,仅表示是否有帐户,则查询如下所示:

SELECT A.company
      ,A.parent-company
      ,CASE WHEN (B.account-id IS NULL) AND (B.account-currency IS NULL)
       THEN 'N'
       ELSE 'Y'
       END AS account-present 
FROM COMPANY A
left join ACCOUNTS B
ON A.company = B.company
WHERE A.parent-company = 'A'

结果如下表:

company parent-company account-present
B A Y
B A Y
C A Y
D A N

似乎我正在到达某个地方,但我真正想要的是: 每家公司一行,指示是否有帐户。

company parent-company account-present
B A Y
C A Y
D A N

有人知道怎么做吗?我已经尝试了很多东西,但我无法得到我的 代码工作。

【问题讨论】:

    标签: sql db2


    【解决方案1】:

    你只想要exists吗?

    select c.company, c.parent_company,
           (case when exists (select 1 from accounts a where a.company = c.company)
                 then 'Y' else 'N'
            end) as has_account
    from company c
    where c.parent_company = 'A';
    

    【讨论】:

    • 谢谢!当我将 where 子句调整为: Where c.parent_company = 'A'
    【解决方案2】:

    这可能是使用最新 Db2 级别的最干净的方式

    SELECT 
        A.*
    ,   B.COMPANY IS NOT NULL AS ACCOUNT_PRESENT
    FROM COMPANY A
    LEFT JOIN (SELECT DISTINCT COMPANY FROM ACCOUNTS) B
    USING ( COMPANY )
    WHERE A.PARENT_COMPANY = 'A'
    

    如果您希望 ACCOUNT_PRESENT 是一个字符而不是 BOOLEAN 列,并且不想使用 JOIN USING,您可以这样做

    SELECT 
        A.*
    ,   CASE WHEN B.COMPANY IS NULL THEN 'N' ELSE 'Y' END AS ACCOUNT_PRESENT
    FROM COMPANY A
    LEFT JOIN (SELECT DISTINCT COMPANY FROM ACCOUNTS) B
    ON  A.COMPANY = B.COMPANY
    WHERE A.PARENT_COMPANY = 'A'
    

    【讨论】:

    • 我无法让第一个工作(而且我只是意识到命名一个表公司并拥有一个名为 company 的字段对于这样的问题并不方便)但第二个工作就像魅力!
    猜你喜欢
    • 2021-03-23
    • 2022-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2013-08-07
    • 2015-07-24
    • 2022-01-14
    相关资源
    最近更新 更多