我基本上是根据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)--
答案 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