用另一个 table 中的多个值替换一个列值 - DB2
Replace a column value with multiple values from another table - DB2
我有一个复杂的查询((Q1 联合 Q2)相交(Q3 联合 Q4))。现在的问题是查询中涉及的列之一具有 'Company' 的值。该值可以是特定的公司名称,也可以是 'ALL' 表示所有公司的值。我有一个单独的公司 table,其中列出了公司名称。现在的逻辑是,如果 intersect 中的一个查询的值为 'ALL',而另一个查询是公司 'C1',则结果应该 return 'C1'。但目前由于 'ALL' 不匹配 'C1' 作为字符串值,所以相交不会 return 任何东西。
无论如何我可以用所有公司名称替换 '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'
)
You can simplify your query like this:
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')
我有一个复杂的查询((Q1 联合 Q2)相交(Q3 联合 Q4))。现在的问题是查询中涉及的列之一具有 'Company' 的值。该值可以是特定的公司名称,也可以是 'ALL' 表示所有公司的值。我有一个单独的公司 table,其中列出了公司名称。现在的逻辑是,如果 intersect 中的一个查询的值为 'ALL',而另一个查询是公司 'C1',则结果应该 return 'C1'。但目前由于 'ALL' 不匹配 'C1' 作为字符串值,所以相交不会 return 任何东西。 无论如何我可以用所有公司名称替换 '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'
)
You can simplify your query like this:
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')