I have some information where the IdNumbers (not primary key Ids, just random Ids assigned to individuals) are not always correct in my first table.
Therefore I am joining my second table on both Ids and names, and trying to get it to where it will join on names only if the IdNumbers do not match.
I’m working on a query with a join statement that is roughly as follows (I’m leaving out the SELECT, WHERE, and ORDER BY sections because I believe that they are not having an effect on this issue and I don’t want to be confusing, as they are stupidly complex – if the portion of the query below should be working like I want it to and the problem is obviously somewhere else, then just tell me so and that will answer my question):
FROM Table1
FULL OUTER JOIN Table2 ON ((Table1.IdNumber = Table2.IdNumber)
OR (Table1.IdNumber != Table2.IdNumber
AND Table1.Lname = Table2.Lname
AND Table1.Fname = Table2.Fname))
However, it is joining the people who have both matching Ids and matching names multiple times like so:
Fname M Lname Table1.IdNumber Table2.IdNumber2
Matthew - Smith 1 2
Matthew H Smith 2 1
Matthew - Smith 1 1
Matthew H Smith 2 2
So it is pulling the last 2 because their ids match, but also joining the first 2 because their ids do not match and their names match, but why is it even joining the first 2 to begin with? I suspect that it ignores the != statement when deciding where to join since the other conditions are fulfilled, but I’d like it to take this != statement into account somehow.
If this should be working, like I said before, just tell me and it will answer my question.
(*EDIT)
Sorry, I should have named these properly – I’ve revised the names. And the full outer join is necessary, I need everything from both tables no matter what and it’s working fine, but thank you for the suggestion.
Given how messy this would be to do in one JOIN, I would suggest using a temp table to hold the relationships.
You can insert all of your IDs from the into first table into a temp table, then do two passes to update a column holding the 2nd table ID – first using where the ID matches, and second where the ID doesn’t match but the name does.
You can then use this table to join the two tables, retrieving up to one record from table 2 for each record in table 1.