我有一个复杂的查询((Q1 union Q2)intersect(Q3 union Q4))。现在问题是涉及查询的列中有一列具有“公司”的价值。这个值可以是一个特定的公司名称或值为'ALL',这意味着所有公司。我有一张单独的公司名单,列出了公司名称。现在逻辑是,如果相交查询中有一个查询的值为'ALL',另一个查询是公司'C1',则结果应该返回'C1'。但目前由于'ALL'与字符串值不匹配'C1',相交不会返回任何东西。 无论如何,我可以用所有公司名称替换'ALL'行值,然后做相交?我想通过SQL来完成所有的操作,因为在代码中处理它将非常麻烦。我正在使用基于DB2的DashDB。用另一个表中的多个值替换列值 - DB2
回答
这是解决我的问题(我已经从查询中删除复杂性,只包括与此相关的问题的部分)
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')
这应该工作:
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 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')
这看起来很酷。不知道这个语法。感谢您的建议。 – Indrani
- 1. 使用另一个表中的值替换表列中的值
- 2. Haskell用另一个值替换列表中的值
- 3. R:用另一列中的值替换多列数据帧中的多个值
- 4. bash(用另一个文件中的值替换列中的值)
- 5. 在SELECT语句中用另一个表替换另一个值
- 6. SQL Server 2008 - 用另一个表中的值替换列中的文本值
- 7. 将一个数据帧列值替换为另一个值
- 8. Excel - 用另一列中的值替换一列中的值
- 9. 用列表中的前一个值替换不需要的值
- 10. REGEXP_REPLACE用单个语句中的值列表替换值列表
- 11. R data.table替换多个列中的值
- 12. 如何用sql loader中的另一个值替换值?
- 13. 如何根据另一个表中的值搜索并替换某些列值?
- 14. 用另一个表替换列
- 15. 替换列在MySQL中另一个表中的列的值选择
- 16. Erlang,用列表中的另一个替换一个原子
- 17. 在循环中用另一个变量的值替换一个变量的值
- 18. 如何创建一个表作为另一个表的副本并用一个语句中的列替换值
- 19. 使用DB2中的连接将多值列从一个表映射到另一个表
- 20. Excel VBA将列值替换为另一个值?
- 21. Python - 如何用另一个列表中的字符串值替换列表中存储的字符串值?
- 22. 一个DB2 Trigger来计算另一个表的平均值
- 23. 根据Microsoft PowerBI中另一个(B)列的值替换(A)列的值
- 24. 用两个值替换无列表
- 25. 在SQL Server中,如何用另一个值替换秒值?
- 26. XQuery - 用解密值替换xml值(db2)
- 27. 如何用oracle中的另一个值替换列中的前两个字符
- 28. 如何用另一个值替换正在更改的阵列?
- 29. Spark:用另一列中的值替换缺失值
- 30. 从另一列的值的列表中创建多个列
代替'intersect'使用'INNER JOIN' - 你需要的所有列和'company'列将看起来像'AND(T1 [公司] = T2加入[公司]或T1。[公司] ='ALL')' – gotqn
感谢您的回应。我会尽力让你知道。但我有一个困惑。这两个表都有公司专栏。那么在select子句中提供哪一方? T1.Company或T2。公司?我需要公司的价值不是'全部'?我怎么知道它将在哪个表中? – Indrani
感谢内部加入并加入'ALL'条件。该方法奏效。 – Indrani