SQL Server具有相同列的两个表,但拾取的数据不包含null
我有下面的示例数据,两个具有相同结构的临时表,但我需要获得一个表输出,并在两个表之间获取最佳值(这里的最佳值不是空值)。忽略两个表中两个相同列之间的空值SQL Server具有相同列的两个表,但拾取的数据不包含null,sql,sql-server,Sql,Sql Server,我有下面的示例数据,两个具有相同结构的临时表,但我需要获得一个表输出,并在两个表之间获取最佳值(这里的最佳值不是空值)。忽略两个表中两个相同列之间的空值 Prog OrderNO ORDERKey OrigType REBNO REBACC A 1 1234 FACILITY 1234 456 A 2 1234 FACILITY 1234 456 A 3
Prog OrderNO ORDERKey OrigType REBNO REBACC
A 1 1234 FACILITY 1234 456
A 2 1234 FACILITY 1234 456
A 3 1234 FACILITY 1234 456
表1
Prog OrderNO ORDERKey OrigType REBNO REBACC
A 1 1234 FACILITY NULL NULL
A 2 1234 FACILITY NULL NULL
A 3 1234 FACILITY NULL NULL
Prog OrderNO ORDERKey OrigType REBNO REBACC
A 1 1234 FACILITY 1234 456
A 2 1234 FACILITY 1234 456
A 3 1234 FACILITY 1234 456
表2
Prog OrderNO ORDERKey OrigType REBNO REBACC
A 1 NULL NULL 1234 456
A 2 NULL NULL 1234 456
A 3 NULL NULL 1234 456
Prog OrderNO ORDERKey OrigType REBNO REBACC
A 1 1234 FACILITY 1234 456
A 2 1234 FACILITY 1234 456
A 3 1234 FACILITY 1234 456
输出
Prog OrderNO ORDERKey OrigType REBNO REBACC
A 1 1234 FACILITY 1234 456
A 2 1234 FACILITY 1234 456
A 3 1234 FACILITY 1234 456
将COALESCE()
与完全外部联接结合使用
:
Prog OrderNO ORDERKey OrigType REBNO REBACC
A 1 1234 FACILITY 1234 456
A 2 1234 FACILITY 1234 456
A 3 1234 FACILITY 1234 456
SELECT
COALESCE( Table1.Prog, Table2.Prog ) AS Prog,
COALESCE( Table1.OrderNo, Table2.OrderNo ) AS OrderNo,
COALESCE( Table1.OrderKey, Table2.OrderKey) AS OrderKey,
COALESCE( Table1.OrigType, Table2.OrigType ) AS OrigType,
COALESCE( Table1.RebNo, Table2.RebNo) AS RebNo,
COALESCE( Table1.RebNo, Table2.RebNo) AS RebAcc
FROM
Table1
FULL OUTER JOIN Table2 ON
Table1.Prog = Table2.Prog
AND
Table1.OrderNo = Table2.OrderNo
将COALESCE()
与完全外部联接结合使用
:
Prog OrderNO ORDERKey OrigType REBNO REBACC
A 1 1234 FACILITY 1234 456
A 2 1234 FACILITY 1234 456
A 3 1234 FACILITY 1234 456
SELECT
COALESCE( Table1.Prog, Table2.Prog ) AS Prog,
COALESCE( Table1.OrderNo, Table2.OrderNo ) AS OrderNo,
COALESCE( Table1.OrderKey, Table2.OrderKey) AS OrderKey,
COALESCE( Table1.OrigType, Table2.OrigType ) AS OrigType,
COALESCE( Table1.RebNo, Table2.RebNo) AS RebNo,
COALESCE( Table1.RebNo, Table2.RebNo) AS RebAcc
FROM
Table1
FULL OUTER JOIN Table2 ON
Table1.Prog = Table2.Prog
AND
Table1.OrderNo = Table2.OrderNo
基于
Prog
和OrderNo
的“最佳值”?这就是数据中唯一记录的标识吗?“最佳值”基于Prog
和OrderNo
?这就是在数据中标识唯一记录的原因吗?为什么是左连接?为什么不是完全的外部连接?“在这个问题上,没有任何东西表明表1应该优于表2。”康拉德弗里克斯同意。在这里,对每个字段(包括表之间的公共字段)进行合并的完整外部联接是更好的解决方案(假设这些表不包含完整的progs/ORDERDIDSSHERK集合。看起来这是可行的,但对于某些字段,它会引发varchar字段的错误。将varchar值“facility”转换为数据类型Int时,转换失败。是否有解决方案,或者我们必须为每个字段编写cast语句?我认为OrderNO也应该在联接中标准。这是OP的错,没有指定字段,也没有对齐字段。为什么是左连接?为什么不是完全的外部连接?在这个问题上,表1不应该比表2好。@ConradFrix同意。一个完全的外部连接,每个字段合并(包括表之间的公共字段)这是一个更好的解决方案(假设这些表不包含完整的progs/ORDERDIDSSHERK集合。看起来这是可行的,但对于某些字段,它会引发varchar字段的错误。将varchar值“facility”转换为数据类型Int时,转换失败。是否有解决方案,或者我们必须为每个字段编写cast语句?我认为OrderNO也应该在联接中标准。这是OP的错误,因为它没有很好地指定和对齐字段