'compare two tables having same column name but different date column names
I have table A
id1 | dt |
---|---|
x1 | 2022-04-10 |
a2 | 2022-04-10 |
a1 | 2022-04-10 |
x1 | 2022-05-10 |
x2 | 2022-04-10 |
y2 | 2022-04-10 |
y1 | 2022-05-10 |
x1 | 2022-06 -10 |
Table B
id1 | dt |
---|---|
a1 | 2022-04-10 |
c3 | 2022-04-10 |
a1 | 2022-05-10 |
l1 | 2022-05-10 |
b1 | 2022-04-10 |
y2 | 2022-04-10 |
x1 | 2022-06-10 |
z1 | 2022-05-10 |
Note: A and B has date values but different column names ( 'dt' for Table A and 'date' for table B)
Desired output:
id1 | DATE |
---|---|
x1 | 2022-04-10 |
a2 | 2022-04-10 |
x2 | 2022-04-10 |
Update 1: note: 1)y2,a1 are not in Desired output because they exists in both tables 2)c3 is not in desired output because it exists in Table B
id1 exists in both tables, but i want "id1" values only from Table A which are not in Table B for the date 2022-04-10.
steps taken so far:
select id1 from A where dt="2022-04-10" EXCEPT select id1 from B
result ( its running for a long time and timing out, not sure its because of Volume of Data or the query is wrong) will check with smaller tables.
I can't use Left Inner Join because Date columns are different ( date vs dt).
Any help would be much appreciated.
Solution 1:[1]
You can do it by applying a UNION
statement between a left joined and a right joined table. From these joins your targets are those rows whose second table values is NULL because of no match:
SELECT tableA.id1,
tableA.dt
FROM tableA
LEFT JOIN tableB
ON tableA.id1 = tableB.id1
AND tableA.dt = tableB.dt
WHERE tableB.id1 IS NULL
AND tableA.dt = '2022-04-10'
UNION
SELECT tableB.id1,
tableB.dt
FROM tableB
LEFT JOIN tableA
ON tableB.id1 = tableA.id1
AND tableB.dt = tableA.dt
WHERE tableA.id1 IS NULL
AND tableB.dt = '2022-04-10'
Find the SQL Fiddle here.
EDIT
Want results only from table A:
SELECT tableA.id1,
tableA.dt
FROM tableA
LEFT JOIN tableB
ON tableA.id1 = tableB.id1
AND tableA.dt = tableB.dt
WHERE tableB.id1 IS NULL
AND tableA.dt = '2022-04-10'
Only from table B?
SELECT tableB.id1,
tableB.dt
FROM tableB
LEFT JOIN tableA
ON tableB.id1 = tableA.id1
AND tableB.dt = tableA.dt
WHERE tableA.id1 IS NULL
AND tableB.dt = '2022-04-10'
Solution 2:[2]
I'm not completely sure of your output. But I think you want something like this:
bind_rows(
anti_join(rename(a,date=dt) %>% filter(date=="2022-04-10"),b %>% filter(date=="2022-04-10")),
anti_join(b %>% filter(date=="2022-04-10"),rename(a,date=dt) %>% filter(date=="2022-04-10"))
)
Output:
id1 date
1: x1 2022-04-10
2: a2 2022-04-10
3: x2 2022-04-10
4: y2 2022-04-10
5: a1 2022-04-10
6: c3 2022-04-10
7: b1 2022-04-10
Solution 3:[3]
This worked as well
with A as (
select distinct id1
from Table_A
where dt = '2022-04-10'
)
, B as (
select distinct id1
from Table_B
where date = '2022-04-10')
select id1 from A
where id1 not in (select id1 from B)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | |
Solution 3 | Somanath Patil |