运行搜索以识别成员

时间:2016-08-18 21:51:50

标签: sql sql-server-2008

我基本上是根据tableA中的信息尝试加入tableB中的单个记录。如果我在原始加入条件下得到多个结果,那么我添加更多并重新运行查询。如果我没有得到任何结果,那么没有任何转移例如:搜索a.FRST_NM = b.FRST_NM。如果有一个结果,请拉出记录。如果不止一个,请添加LAST_NM,如果有一个结果,请拉出该记录。等等,直到我有一条记录。我可以一次做一个,但每次通过会发生2到3次。

这是因为某些字段未填充在一个表中,而是在另一个表中。我只是不知道如何在不重写整个FROM语句的情况下添加连接条件,或者如果只有一个结果,如何只提取记录。

IF(CONDITION_1 from JOIN_1) = 1 result THEN a.field_1 = b.field_1 and a.field_2 = b.field_2 

IF (CONDITION_1 from JOIN_1) > 1 result THEN (additional joining conditions + JOIN_1) as JOIN_1a 

ELSE IF(CONDITION_1 from JOIN_1a) = 1 result then a.field_1 = b.field_1 and    a.field_2 = b.field_2

IF(CONDITION_1 from JOIN_1) = 0 results then NO MOVE

--(Repeat with different tables and joining conditions)--

2 个答案:

答案 0 :(得分:1)

嗯。一种方法是在一个字段上加入,然后根据其他字段确定优先级。另一种方法是使用left join。那看起来像是:

select t1.*, coalesce(t2a.col, t2b.col, t2c.col) as col
from t1 left join
     t2 t2a
     on t1.col1 = t2a.col1 and t1.col2 = t2a.col2 and t1.col3 = t2a.col3 left join
     t2 t2b
     on t1.col1 = t2b.col1 and t1.col2 = t2b.col2 and t2b.col1 is null left join
     t2 t2c
     on t1.col1 = t2c.col1 and t2b.col1 is null;

答案 1 :(得分:1)

SELECT *
FROM (
    SELECT
       *
       ,CASE WHEN a.LAST_NM = b.LAST_NM THEN 'matched' ELSE 'not matched' END LastNameMatchedExample
       ,ROW_NUMBER() OVER (PARTITION BY 1 ORDER BY 
                CASE
                    WHEN a.LAST_NM = b.LAST_NM AND a.Field1 = b.Field1 AND a.Field2 = b.Field2 AND a.Field3 = b.Field3 THEN 0
                    WHEN a.LAST_NM = b.LAST_NM AND a.Field1 = b.Field1 AND a.Field2 = b.Field2 THEN 1
                    WHEN a.LAST_NM = b.LAST_NM AND a.Field1 = b.Field1 THEN 2
                    WHEN a.LAST_NM = b.LAST_NM THEN 3
                    ELSE 4
                END
             ) as RowNumber
    FROM
       TableA a
       INNER JOIN TableB b
       ON a.FIRST_NM = b.FIRST_NM
    ) results
WHERE
    results.RowNumber = 1

所以基本上只对First_NM标准进行搜索,然后按列表进行构建和排序,允许您根据匹配情况选择所需的确切记录,如果匹配且匹配等,则无论记录多少返回后,您可以获得第一个结果。因为所有内容都来自相同的2个表,所以您应始终保持所需的最多列数,如果没有匹配等,您可以使用CASE STATEMENTS将值设为NULL。

下面是一个类似的方法,它将处理字段的优先级,但有点像处理其他字段匹配的OR条件。所以在这个例子中,它将根据匹配等的匹配存在进行排序,并遍历所有语句。与上述不同的地方是说没有发生LAST_NM匹配,但是在一条记录上发生了field1匹配,而在另一条记录上发生了匹配,它不会使field1匹配更高的结果。

SELECT *
FROM (
    SELECT
       *
       ,CASE WHEN a.LAST_NM = b.LAST_NM THEN 'matched' ELSE 'not matched' END LastNameMatchedExample
       ,ROW_NUMBER() OVER (PARTITION BY 1 ORDER BY 
                CASE WHEN a.LAST_NM = b.LAST_NM THEN 0 ELSE 1 END
                ,CASE WHEN a.Field1 = b.Field1 THEN 0 ELSE 1 END
                ,CASE WHEN a.Field2 = b.Field2 THEN 0 ELSE 1 END
                ,CASE WHEN a.Field3 = b.Field3 THEN 0 ELSE 1 END
             )
    FROM
       TableA a
       INNER JOIN TableB b
       ON a.FIRST_NM = b.FIRST_NM
    ) results
WHERE
    results.RowNumber = 1