2017-08-31 245 views
0

我有一個複雜的查詢((Q1 union Q2)intersect(Q3 union Q4))。現在問題是涉及查詢的列中有一列具有「公司」的價值。這個值可以是一個特定的公司名稱或值爲'ALL',這意味着所有公司。我有一張單獨的公司名單,列出了公司名稱。現在邏輯是,如果相交查詢中有一個查詢的值爲'ALL',另一個查詢是公司'C1',則結果應該返回'C1'。但目前由於'ALL'與字符串值不匹配'C1',相交不會返回任何東西。 無論如何,我可以用所有公司名稱替換​​'ALL'行值,然後做相交?我想通過SQL來完成所有的操作,因爲在代碼中處理它將非常麻煩。我正在使用基於DB2的DashDB。用另一個表中的多個值替換列值 - DB2

+1

代替'intersect'使用'INNER JOIN' - 你需要的所有列和'company'列將看起來像'AND(T1 [公司] = T2加入[公司]或T1。[公司] ='ALL')' – gotqn

+0

感謝您的迴應。我會盡力讓你知道。但我有一個困惑。這兩個表都有公司專欄。那麼在select子句中提供哪一方? T1.Company或T2。公司?我需要公司的價值不是'全部'?我怎麼知道它將在哪個表中? – Indrani

+0

感謝內部加入並加入'ALL'條件。該方法奏效。 – Indrani

回答

0

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

SELECT AA.OBJECT_TYPE查詢, AA.OBJECT_FILTER_ID,CASE WHEN BB.OBJECT_FILTER_VALUE = 'ALL' THEN ELSE AA.OBJECT_FILTER_VALUE END BB.OBJECT_FILTER_VALUE AS OBJECT_FILTER_VALUE FROM(SELECT OBJECT_TYPE,OBJECT_FILTER_ID,從COMPANY OBJECT_FILTER_VALUE)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 = '所有' 或BB.OBJECT_FILTER_VALUE = 'ALL')

1

這應該工作:

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 
+0

感謝您的回覆。我認爲交叉應用只適用於SQL Server。我在這裏使用DB2。 DB2中有沒有其他的選擇可以交叉應用? – Indrani

+0

對不起,不知道DB2不支持交叉應用。 我已經用一個解決方案更新了我的答案,該解決方案也應該起作用,正如gotqn所建議的那樣。 –

+0

這種方法奏效!我不得不修改一下查詢。在子句中也包含一些情況。謝謝您的幫助。 – Indrani

0

可以簡化您的查詢是這樣的:。

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') 
+0

這看起來很酷。不知道這個語法。感謝您的建議。 – Indrani

相關問題