我正在尝试在SQL Server中连接两个表。他们在桌子上没有PK / FK所以我必须在几个条件下加入。
我想要发生的事情是,如果我无法按照我的第一个标准进行匹配,那么我想加入不同的标准。我认为可以使用case语句来做到这一点...如果它在我的第一个条件匹配那么一切都很好,如果它在第一个条件上不匹配则尝试加入不同的条件。
这是我到目前为止所拥有的。
SELECT *
FROM Table1
INNER JOIN Table2
ON Table1.DOS = CAST(SUBSTRING(Table2.SurgeryDate, 6, 2) + '/' + SUBSTRING(Table2.SurgeryDate, 9, 2) + '/' + SUBSTRING(Table2.SurgeryDate, 1, 4) AS DATE)
AND Table1.DateOfBirth = CAST(SUBSTRING(Table2.BirthDate, 6, 2) + '/' + SUBSTRING(Table2.BirthDate, 9, 2) + '/' + SUBSTRING(Table2.BirthDate, 1, 4) AS DATE)
AND Table1.Gender = CASE WHEN Table2.gender = 'Male' THEN 'M'
WHEN Table2.gender = 'Female' THEN 'F'
ELSE 'U'
END
AND LTRIM(RTRIM(Table1.HspId)) = LTRIM(RTRIM(Table2.HspId))
---If those people who do not match on the above criteria then I would want to match them on their last name.
答案 0 :(得分:2)
需要样本数据来给出具体答案,但这里有几种常规方法:
您可以在排除先前条件时使用OR
:
SELECT cols
FROM Table1 t1
JOIN Table2 t2 ON t1.col1 = t2.col1
OR (t1.col1 <> t2.col1 AND t1.col2 = t2.col2)
请注意,您必须排除先前的条件以创建连接谓词层次结构并避免重复。
另一种方法是对每个条件使用重复的LEFT JOIN
并添加NULL
处理:
SELECT COALESCE(t2.col1, t3.col1)
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.col1 = t2.col1
LEFT JOIN Table2 t3 ON t1.col2 = t3.col2
WHERE COALESCE(t2.col1, t3.col1) IS NOT NULL
COALESCE()
返回第一个非NULL
值。如果联接找不到匹配行,LEFT JOIN
将返回NULL
。因此,选择COALESCE()
正在处理&#39;显示&#39;基于连接层次结构顺序的正确列。 where COALESCE()
过滤掉没有连接成功的行(重新创建当前查询中的INNER JOIN
)
第二种方法虽然难看,但可以更好地执行,因为OR
查询无法正确优化。