如何匹配 SQL 服务器中的变量数据

How to match variable data in SQL Server

我需要映射两个平面 table 之间的多对多关系。 Table A 包含可能配置的列表(其中每一列都是一个问题,单元格值是答案)。 NULL 值表示答案无关紧要。 Table B 包含具有相同列的实际配置。

最终,我需要最终结果来显示 table B 和 A 之间映射了哪些配置:

Example 

ActualId | ConfigId
---------+---------
    5    |  1
    6    |  1
    8    |  2
    .    |  .
    .    |  .
    .    |  .
    N    |  M 

举一个我正在处理的 table 和数据的简单示例,第一个 table 看起来像这样:

Table A
--------
ConfigId | Size | Color | Cylinders | ... | ColumnN
---------+------+-------+-----------+-----+--------
    1    |  3   |       |    4      | ... |   5   
    2    |  4   |   5   |    5      | ... |   5
    3    |      |   5   |           | ... |   5

而 Table B 看起来像这样:

Table B
-------
ActualId | Size | Color | Cylinders | ... | ColumnN
---------+------+-------+-----------+-----+--------
    1    |  3   |  1    |    4      | ... |    5
    2    |  3   |  8    |    4      | ... |    5
    3    |  4   |  5    |    5      | ... |    5
    4    |  7   |  5    |    6      | ... |    5

由于 NULL 值表示任何值都可以工作,因此预期结果将是:

Expected      
---------
ActualId | ConfigId
---------+---------
   1     |    1
   2     |    1
   3     |    2
   3     |    3
   4     |    3

我正在尝试找出匹配超过一百列的实际数据的最佳方法。我知道尝试检查每一列的 NULL 值是绝对错误的并且不会执行良好。我真的很着迷这个问题,希望能得到一些帮助来找到解决这个问题的最佳方法。

因此,这加入了 table 尺寸、颜色和柱面。

尺寸匹配将是 A 对 B: 如果 A.SIZE 为空,则比较将 B.SIZE=B.SIZE 始终 return 为真。 如果 A.SIZE 不为空,则比较将是 A.SIZE=B.SIZE,只有当它们匹配时才为真。

颜色和圆柱体的搭配类似

SELECT * FROM TABLEA A
    INNER JOIN TABLEB B ON ISNULL(A.SIZE, B.SIZE)=B.SIZE
        AND ISNULL(A.COLOR, B.COLOR)=B.COLOR
        AND ISNULL(A.CYLINDERS, B.CYLINDERS)=B.CYLINDERS