Some data to test:
CREATE TABLE Tbl_1 (
ID1 integer NOT NULL
, ID2 int NOT NULL
, SomeData varchar(20)
);
ALTER TABLE Tbl_1 ADD
CONSTRAINT pk_tbl_1 PRIMARY KEY (ID1, ID2);
CREATE TABLE Tbl_2 (
ID1 integer NOT NULL
, ID2 int NOT NULL
, SomeData varchar(20)
);
ALTER TABLE Tbl_2 ADD
CONSTRAINT pk_tbl_2 PRIMARY KEY (ID1, ID2);
INSERT INTO Tbl_1
(ID1, ID2, SomeData)
VALUES
(1, 1, '1_1')
, (2, 2, '2_2')
, (3, 3, '3_3')
;
INSERT INTO Tbl_2
(ID1, ID2, SomeData)
VALUES
(1, 1, '1_1')
, (3, 3, '3_3')
, (4, 4, '4_4')
;
...
-- All rows that are in the first table,
-- but not in the second one
SELECT
a.ID1 AS t1_ID1
,a.ID2 AS t1_ID2
,a.SomeData AS t1_SomeData
,b.ID1 AS t2_ID1
,b.ID2 AS t2_ID2
,b.SomeData AS t2_SomeData
FROM Tbl_1 as a
LEFT JOIN Tbl_2 as b ON b.ID1 = a.ID1 AND b.ID2 = a.ID2
WHERE b.ID1 IS NULL;
Returns:
t1_ID1 t1_ID2 t1_SomeData t2_ID1 t2_ID2 t2_SomeData
------- -------- ------------- -------- -------- -----------
2 2 2_2 NULL NULL NULL
...
-- All rows that are in the second table,
-- but not in the first one
SELECT
a.ID1 AS t1_ID1
,a.ID2 AS t1_ID2
,a.SomeData AS t1_SomeData
,b.ID1 AS t2_ID1
,b.ID2 AS t2_ID2
,b.SomeData AS t2_SomeData
FROM Tbl_1 as a
RIGHT JOIN Tbl_2 as b ON b.ID1 = a.ID1 AND b.ID2 = a.ID2
WHERE a.ID1 IS NULL;
Returns:
t1_ID1 t1_ID2 t1_SomeData t2_ID1 t2_ID2 t2_SomeData
------- ------- ------------- -------- ------- ------------
NULL NULL NULL 4 4 4_4
...
-- Common to both tables
SELECT
a.ID1 AS t1_ID1
,a.ID2 AS t1_ID2
,a.SomeData AS t1_SomeData
,b.ID1 AS t2_ID1
,b.ID2 AS t2_ID2
,b.SomeData AS t2_SomeData
FROM Tbl_1 as a
JOIN Tbl_2 as b ON b.ID1 = a.ID1 AND b.ID2 = a.ID2;
Returns
t1_ID1 t1_ID2 t1_SomeData t2_ID1 t2_ID2 t2_SomeData
----------- ----------- ------------- ----------- ----------- ------------
1 1 1_1 1 1 1_1
3 3 3_3 3 3 3_3