Looking at your database.
You will save yourself a lot of grief/pain and syntax errors if you use a naming convention that uses only alphanumeric and "_" underscore character. No Spaces, No special characters.
Union query is not for comparing datasets.
I think Join on the 3 fields is best.
Records in Ledger Not in Statement
Code:
SELECT tblLEDGER.ID
, tblLEDGER.CUSIP
, tblLEDGER.TRANTYPE
, tblLEDGER.AMOUNT
, tblLEDGER.[L/S]
, tblLEDGER.[Familiar Code]
, tblSTATEMENT.[Familiar Code]
, tblSTATEMENT.TRANTYPE
FROM tblLEDGER LEFT JOIN tblSTATEMENT ON
(tblLEDGER.[CUSIP] = tblSTATEMENT.[CUSIP]) AND
(tblLEDGER.TRANTYPE = tblSTATEMENT.TRANTYPE) AND
(tblLEDGER.[Familiar Code] = tblSTATEMENT.[Familiar Code])
WHERE
(((tblSTATEMENT.CUSIP) Is Null) AND
((tblSTATEMENT.[Familiar Code]) Is Null) AND
((tblSTATEMENT.TRANTYPE) Is Null));
Records in Statement not in Ledger
Code:
SELECT tblSTATEMENT.ID
, tblSTATEMENT.CUSIP
, tblSTATEMENT.TRANTYPE
, tblSTATEMENT.AMOUNT
, tblSTATEMENT.[L/S]
, tblSTATEMENT.[Familiar Code]
, tblLEDGER.[Familiar Code]
FROM tblSTATEMENT LEFT JOIN tblLEDGER ON
(tblSTATEMENT.[Familiar Code] = tblLEDGER.[Familiar Code]) AND
(tblSTATEMENT.TRANTYPE = tblLEDGER.TRANTYPE) AND
(tblSTATEMENT.CUSIP = tblLEDGER.CUSIP)
WHERE
(((tblLEDGER.CUSIP) Is Null) AND
((tblLEDGER.TRANTYPE) Is Null) AND
((tblLEDGER.[Familiar Code]) Is Null));
I hope these help you find what you're looking for [untested].