简体   繁体   中英

Count on UNION in Oracle

I have 3 table and I need to get the details from 2 tables where the count of UNION is greater than 1.But need to apply certain conditions as well

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

Now I need to have the count of UNION from Table A and Table B where they have count of cat_id greater than 1 and Table A.name != Table B.name

The result which I require is

p_id name  cat_id
 45  abcd  win_1
P123 asdf  win_1
46   efgh  win_2
47   efgh1 win_2

win_5 is excluded as the count is one and win_4 should be excluded as name in Table A nd B is same.

I have run out of Ideas as i am relatively new to Oracle and DB.Any help is appreciated.

I think you can use exists to ensure that the cat_id is present in both tables

  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, name, parent_id 
  from table_b b
  where exists (select null from table_a where b.parent_id = table_a.category)

I believe you are looking for something like this -

 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, name, category from TableA
         Union 
        Select product_id as Pid, name, parent_id as category from TableB) T2
      ON T1.category = T2.category;

Would you try this code. First CTE (Common Table Expression) "list_union" gets the records for each table those have different name s then makes the union. with the second CTE "list_cnt" counts the categories and finally gets the result cnt>1 with the last select statement as you pictured.

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, 
        name, 
        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,
    name,
    category AS cat_id
FROM list_cnt
WHERE cnt>1
ORDER BY cat_id ASC, p_id ASC
;

Just use a union all and window functions:

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;

Although you describe the problem as:

Now I need to have the count of UNION from Table A and Table B where they have count of cat_id greater than 1 and Table A.name != Table B.name

You seem to just want cat_id s that have different names across the two tables. Your sample data includes cat_id = 'win_2' , which is not even in the second table.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM