繁体   English   中英

SQL Server中的条件内部联接语句

[英]Conditional Inner Join Statements in 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. 

需要样本数据来给出具体答案,但是这里有一些通用方法:

您可以在排除先前条件的同时使用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找不到匹配的行,则LEFT JOIN将返回NULL 因此,select COALESCE()正在根据联接层次结构顺序来“显示”正确的列。 COALESCE()将过滤掉没有连接成功的行(重新创建您在当前查询中拥有的INNER JOIN

第二种方法虽然丑陋,但可以执行得更好,因为OR查询无法正确优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM