I have a table T1
| Col1 | Col2 | Col3 |
|---|---|---|
| 1 | A | A1 |
| 2 | A | A2 |
| 3 | A | A3 |
| 4 | A | A4 |
| 6 | B | B1 |
| 7 | B | B2 |
| 8 | B | B3 |
I have another table T2 that looks like this:
| TC1 | TC2 |
|---|---|
| 1 | A1 |
| 2 | A6 |
| 3 | A7 |
| 4 | A8 |
| 6 | B7 |
| 7 | B9 |
| 8 | B0 |
I want to identify if Col3 in T1 having any of the values matching TC2 of T2, then create a new column (Col4) to flag all the Col2 containing any Col3 that are the same to be "Match" if not, "No Match". See example desired output below. I think I might need to use sub-query but not sure how.
Because A1 exists in both T1 and T2, then all rows in Col2 of the same cluster (A) needs to have Col4 flagged with "Match"
| Col1 | Col2 | Col3 | Col4 |
|---|---|---|---|
| 1 | A | A1 | Match |
| 2 | A | A2 | Match |
| 3 | A | A3 | Match |
| 4 | A | A4 | Match |
| 6 | B | B1 | No Match |
| 7 | B | B2 | No Match |
| 8 | B | B3 | No Match |
CodePudding user response:
Seems like you could use a LEFT JOIN and a conditional windowed aggregate:
SELECT T1.Col1,
T1.Col2,
T1.Col3,
MIN(CASE T1.Col3 WHEN T2.Col3 THEN 'Match' ELSE 'No Match' END) OVER (PARTITION BY T1.Col2) AS Col4
FROM dbo.Table1 T1
LEFT JOIN dbo.Table2 T2 ON T1.Col3 = T2.TC2; --I really hope these aren't your free column/object names
