I need to merge two recordsets with different columns in a single query. My recordsets are queries, but for the purposes of showing the problem, I'm representing them here as tables. Here is the setup in Access:
What I need is a datasheet with values for Data_1 and Data_2 when they exist, based on the values of ID1 and ID2:
| ID1 | ID2 | Data_1 | Data_2 |
|---|---|---|---|
| 1 | 1 | A | X |
| 2 | 1 | B | |
| 3 | 1 | Y | |
| 4 | 1 | C | Z1 |
| 4 | 2 | Z2 |
I'm trying to do this by doing a left join from ID1 to ID1_1 and to ID1_2. This gives me the correct output for ID1 values of 1, 2, and 3. But I have not been able to get the right output of the two rows for ID1 = 4.
For example, the SQL:
SELECT ID1, nz(ID2_1, ID2_2) AS ID2, Data_1, Data_2
FROM (ID1 LEFT JOIN Table_1 ON ID1.ID1 = Table_1.ID1_1)
LEFT JOIN Table_2 ON ID1.ID1 = Table_2.ID1_2
WHERE Data_1 Is Not Null OR Data_2 Is Not Null;
gives me two rows for ID1 = 4, but the second one is wrong:
and the SQL:
SELECT ID1, nz(ID2_1, ID2_2) AS ID2, Data_1, Data_2
FROM (ID1 LEFT JOIN Table_1 ON ID1.ID1 = Table_1.ID1_1)
LEFT JOIN Table_2 ON ID1.ID1 = Table_2.ID1_2
WHERE ID2_1 is not null and ID2_2 is null or
ID2_1 is null and ID2_2 is not null or
ID2_1 = ID2_2;
gives me only one row for ID1 = 4:
What am I doing wrong? What do I need to do to get the required output?
CodePudding user response:
Consider:
SELECT Table_2.ID1_2, Table_2.ID2_2, Table_1.Data_1, Table_2.Data_2
FROM Table_2 LEFT JOIN Table_1 ON (Table_2.ID2_2 = Table_1.ID2_1) AND (Table_2.ID1_2 = Table_1.ID1_1)
UNION
SELECT Table_1.ID1_1, Table_1.ID2_1, Table_1.Data_1, Table_2.Data_2
FROM Table_1 LEFT JOIN Table_2 ON (Table_1.ID2_1 = Table_2.ID2_2) AND (Table_1.ID1_1 = Table_2.ID1_2);



