SQL Server中的条件内连接语句

时间:2018-06-06 19:34:35

标签: sql sql-server

我正在尝试在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. 

1 个答案:

答案 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查询无法正确优化。