'How to select distinct from two tables and then join them
I've seen similar questions, but none of the fits my issue.
I have two tables:
WorkTable
| WorkCode | WorkDescription |
|---|---|
| 220001 | WorkDescription1 |
| 220002 | WorkDescription2 |
| 220003 | WorkDescription3 |
| 220004 | WorkDescription4 |
TasksTable
| TaskCode | WorkCode | TaskDescription |
|---|---|---|
| AV0001 | TaskDescription1 | |
| AV0002 | 220002 | TaskDescription2 |
| AV0003 | 220003 | TaskDescription3 |
| AV0004 | 220003 | TaskDescription4 |
I need to get this results
ResultTable
| TaskCode | WorkCode | TaskDescription | WorkDescription |
|---|---|---|---|
| 220001 | WorkDescription1 | ||
| AV0001 | TaskDescription1 | ||
| 220002 | AV0002 | TaskDescription2 | WorkDescription2 |
| 220003 | AV0003 | TaskDescription3 | WorkDescription3 |
| 220003 | AV0004 | TaskDescription4 | WorkDescription3 |
| 220004 | WorkDescription4 |
I've tried several queries, but it lefts out the TaskCodes that have no WorkCode associated:
WrongResultTable
| TaskCode | WorkCode | TaskDescription | WorkDescription |
|---|---|---|---|
| 220001 | WorkDescription1 | ||
| 220002 | AV0002 | TaskDescription2 | WorkDescription2 |
| 220003 | AV0003 | TaskDescription3 | WorkDescription3 |
| 220003 | AV0004 | TaskDescription4 | WorkDescription3 |
| 220004 | WorkDescription4 |
Can someone help me? Thank you
Solution 1:[1]
It's not very elegant, but see below.
--This section is just creating the temp tables with the data you provided.
DECLARE @WorkTable TABLE (
WorkCode INT,
WorkDescription NVARCHAR(50))
INSERT INTO @WorkTable (WorkCode, WorkDescription)
VALUES (220001, 'WorkDescription1') , (220002, 'WorkDescription2'), (220003, 'WorkDescription3'), (220004, 'WorkDescription4')
DECLARE @TasksTable TABLE (
TaskCode NVARCHAR(50),
WorkCode INT ,
TaskDescription NVARCHAR(50))
INSERT INTO @TasksTable (TaskCode, WorkCode, TaskDescription)
VALUES ('AV0001', NULL, 'TaskDescription1') , ('AV0002', 220002, 'TaskDescription2'), ('AV0003', 220003, 'TaskDescription3'), ('AV0004', 220003, 'TaskDescription4')
;
--Actual SQL query starts here
WITH a as (
select distinct w.WorkCode, t.TaskCode, t.TaskDescription, w.WorkDescription
from @WorkTable w
LEFT JOIN @TasksTable t
on t.WorkCode = w.WorkCode) ,
b as (
SELECT distinct a.WorkCode, tt.TaskCode, tt.TaskDescription, a.WorkDescription
FROM @TasksTable tt
left join a
on tt.WorkCode = a.WorkCode) ,
c as (
select *
from a
union all
select *
from b)
select distinct c.WorkCode, c.TaskCode, c.TaskDescription, c.WorkDescription
from c
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 | trice |
