2

I have two tables A and B, Table A have 3 cols and table B have 2 cols.

Table A data:

name id city
xyz 1 ab
xyz2 2 ab1
xyz3 3 ab2

Table B data:

name id
xyz3 3
abc2 4

Output I want:

name id city match
xyz 1 ab no
xyz2 2 ab1 no
xyz3 3 ab2 yes
abc2 4 NULL no

I have tried this but it is giving op in different column:

select *
from TableA a
full outer join TableB b
on a.id= b.id

Output I'm getting

name id city name id
xyz 1 ab null null
xyz2 2 ab1 null null
xyz3 3 ab2 xyz3 3
Null null null abc2 4

Output I want:

name id city match
xyz 1 ab no
xyz2 2 ab1 no
xyz3 3 ab2 yes
abc2 4 NULL no
0

3 Answers 3

2

The following is all I think you need to do - union the two tables and then aggregate, counting rows to identify matches with duplicates from both tables:

with c as (
    select name, id, city
    from a union all
    select name, id, null
    from b
)
select name, id, Max(city) City,
  case when Count(*)> 1 then 'yes' else 'no' end Match
from c
group by name, id;

See demo fiddle

Sign up to request clarification or add additional context in comments.

Comments

1

You can use a UNION between TableA and TableB, a CASE statement to check if an id in TableA is also inTableB (for your match column), and a NOT EXISTS subquery to TableA in TableB's WHERE clause to only return rows that exist in TableB.

SELECT *, 
  CASE WHEN id IN (SELECT DISTINCT id FROM TableB) THEN 'yes' ELSE 'no' END AS match
FROM TableA a
   UNION
SELECT *, NULL AS city, 'no' AS match
FROM TableB b 
  WHERE NOT EXISTS (SELECT 1 FROM TableA a2 WHERE a2.id = b.id)
ORDER BY id ASC

Result:

| name | id | city | match  |
|------|----|------|--------|
| xyz  | 1  | ab   | no     |
| xyz2 | 2  | ab1  | no     |
| xyz3 | 3  | ab2  | yes    |
| abc2 | 4  | null | no     |

Fiddle here.

Comments

0
select * from (
select a.name, a.id, a.city, 
  case when b.id is not null then 'Yes' else 'No' end as [Match]
from tableA a
  left join tableB b  on b.name = a.name and b.id = a. id
union 
select b.name, b.id, a.city,
  case when a.id is not null then 'Yes' else 'No' end as [Match]
from tableB b left join tableA a on b.name = a.name and b.id = a. id) tmp
  order by id  ;

Here is DBFiddle demo

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.