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的错误,因为它没有很好地指定和对齐字段