簡體   English   中英

用另一個表中的多個值替換列值 - DB2

[英]Replace a column value with multiple values from another table - DB2

我有一個復雜的查詢((Q1 聯合 Q2)相交(Q3 聯合 Q4))。 現在的問題是查詢中涉及的列之一具有“公司”的值。 該值可以是特定的公司名稱或“ALL”值(表示所有公司)。 我有一個單獨的公司表,其中列出了公司名稱。 現在的邏輯是,如果 intersect 中的一個查詢的值為“ALL”,而另一個查詢是公司“C1”,則結果應返回“C1”。 但目前由於 'ALL' 不匹配 'C1' 作為字符串值,因此相交不會返回任何內容。 無論如何我可以用所有公司名稱替換“ALL”行值然后進行相交嗎? 我想通過SQL來完成所有的操作,因為在代碼中處理它會很麻煩。 我正在使用基於 DB2 的 DashDB。

那應該工作:

select
    company_name
    ,the
    ,other
    ,columns
from 
(
    select distinct
        company_name = ca.company_name
        ,the
        ,other
        ,columns
    from Q1
        inner join companies_table ca
            on Q1.company_name = ca.company_name
            or Q1.company_name = 'ALL'

    union

    select distinct
        company_name = ca.company_name
        ,the
        ,other
        ,columns
    from Q2
        inner join companies_table ca
            on Q2.company_name = ca.company_name
            or Q2.company_name = 'ALL'
) a

intersect

select
    company_name
    ,the
    ,other
    ,columns
from 
(
    select distinct
        company_name = ca.company_name
        ,the
        ,other
        ,columns
    from Q3
        inner join companies_table ca
            on Q3.company_name = ca.company_name
            or Q3.company_name = 'ALL'

    union

    select distinct
        company_name = ca.company_name
        ,the
        ,other
        ,columns
    from Q4
        inner join companies_table ca
            on Q4.company_name = ca.company_name
            or Q4.company_name = 'ALL'
) b

這是解決我的問題的查詢(我已經從查詢中刪除了復雜性,只包括與這個問題相關的那些部分)

SELECT 
AA.OBJECT_TYPE, 
AA.OBJECT_FILTER_ID, 
CASE WHEN BB.OBJECT_FILTER_VALUE = 'ALL' 
  THEN AA.OBJECT_FILTER_VALUE 
  ELSE BB.OBJECT_FILTER_VALUE 
  END AS OBJECT_FILTER_VALUE FROM 
( 
    SELECT 
    OBJECT_TYPE, 
    OBJECT_FILTER_ID, 
    OBJECT_FILTER_VALUE 
    from COMPANY
) AS AA 
INNER JOIN 
( 
    SELECT 
    OBJECT_TYPE ,
    OBJECT_FILTER_ID ,
    OBJECT_FILTER_VALUE 
    FROM DETAILS
) AS BB 
ON 
AA.OBJECT_TYPE = BB.OBJECT_TYPE AND 
AA.OBJECT_FILTER_ID = BB.OBJECT_FILTER_ID AND
(
AA.OBJECT_FILTER_VALUE = BB.OBJECT_FILTER_VALUE OR 
AA.OBJECT_FILTER_VALUE = 'ALL' OR 
BB.OBJECT_FILTER_VALUE = 'ALL'
)

您可以像這樣簡化查詢:

SELECT AA.OBJECT_TYPE, AA.OBJECT_FILTER_ID, 
CASE WHEN BB.OBJECT_FILTER_VALUE = 'ALL' THEN AA.OBJECT_FILTER_VALUE ELSE BB.OBJECT_FILTER_VALUE END AS OBJECT_FILTER_VALUE 
FROM COMPANY AS AA 
INNER JOIN DETAILS AS BB ON (AA.OBJECT_TYPE, AA.OBJECT_FILTER_ID)=(BB.OBJECT_TYPE, BB.OBJECT_FILTER_ID) 
AND(AA.OBJECT_FILTER_VALUE = BB.OBJECT_FILTER_VALUE OR AA.OBJECT_FILTER_VALUE = 'ALL' OR BB.OBJECT_FILTER_VALUE = 'ALL')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM