如何解决依靠Oracle中的UNION
我有3个表,我需要从2个表中获取详细信息,其中UNION的计数大于1,但是还需要应用某些条件
Table A
id entity_id name category
1 45 abcd win_1
2 46 efgh win_2
3 47 efgh1 win_2
4 48 dfgh win_5
5 49 adfgh win_4
Table B
id product_id name parent_id
1 P123 asdf win_1
2 P234 adfgh win_4
Table 3 category_list
id cat_id name
1 win_1 Households
2 win_2 Outdoors
3 win_3 Mixed
4 win_4 Omni
现在,我需要具有表A和表B中的UNION计数,其中cat_id的计数大于1并且表A.name!=表B.name
我需要的结果是
p_id name cat_id
45 abcd win_1
P123 asdf win_1
46 efgh win_2
47 efgh1 win_2
win_5
被排除,因为计数为1,win_4
应该被排除,因为表A和表B中的名称相同。
由于我对Oracle和DB相对较新,因此我已经用尽了Ideas。感谢您的帮助。
解决方法
我认为您可以使用exists
来确保cat_id在两个表中都存在
select entity_id as p_id,name,category as cat_id
from table_a a
where exists (select null from table_b where a.category = table_b.parent_id)
union
select entity_id,parent_id
from table_b b
where exists (select null from table_a where b.parent_id = table_a.category)
,
我相信您正在寻找类似的东西-
Select T2.*
from
(Select category
from
(Select name,category from TableA
Union all
Select name,parent_id as category from TableB) t
group by category
having count(distinct name) > 1) T1
Join
(Select entity_id as Pid,category from TableA
Union
Select product_id as Pid,parent_id as category from TableB) T2
ON T1.category = T2.category;
,
您可以尝试此代码。 第一个CTE(公用表表达式)“ list_union” 获取具有不同 name 的每个表的记录,然后进行合并。第二个CTE “ list_cnt” 对类别进行计数,并最终获得如图所示的最后一个select语句的结果cnt> 1。
With
list_union AS (
SELECT
id,----------
TO_CHAR(entity_id) entity_id,----------
name,category
FROM table_A a
WHERE NOT EXISTS(SELECT 1 FROM table_B b WHERE a.name=b.name)
----------
UNION ALL
----------
SELECT
id,product_id,parent_id
FROM table_B b
WHERE NOT EXISTS(SELECT 1 FROM table_A a WHERE a.name=b.name)
),list_cnt AS (
SELECT
l.*,----------
COUNT(*) over (PARTITION BY category) cnt
----------
FROM list_union l
)
SELECT
entity_id AS p_id,category AS cat_id
FROM list_cnt
WHERE cnt>1
ORDER BY cat_id ASC,p_id ASC
;
,
只需使用union all
和窗口函数:
select ab.*
from (select ab.*,count(distinct name) over (partition by category) as cnt
from ((select a.* from a
) union all
(select b.* from b
)
) ab
) ab
where cnt > 1;
尽管您将问题描述为:
现在,我需要具有表A和表B中的UNION计数,其中cat_id的计数大于1并且表A.name!=表B.name
您似乎只想要{}在两个表中具有不同名称的cat_id
。您的样本数据包括cat_id = 'win_2'
,该数据甚至不在第二张表中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。