【问题标题】:How to join two tables based on missing values in one table?如何根据一张表中的缺失值连接两张表?
【发布时间】:2013-11-01 06:18:10
【问题描述】:

抱歉,如果这个问题之前已经回答过了。我打猎了,但没有找到。

问题:

我使用的是 SQL Server 2012,我有两个表(TableATableB),如下所示

表 A

+-------+--------+
| ItemA | SeqNoA |
+-------+--------+
| D     |      1 |
| A     |      0 |
| Z     |      0 |
| B     |      4 |
| A     |      0 |
| K     |      6 |
+-------+--------+

表B

+-------+--------+
| ItemB | SeqNoB |
+-------+--------+
| A     |      1 |
| D     |      2 |
| C     |      3 |
| A     |      4 |
| B     |      5 |
| J     |      6 |
+-------+--------+

TableA 在 col SeqNo 的某些行中缺少(零)值,而在 TableB 的 col SeqNo 中存在相同的值。我需要找到某种方法来加入这些表,以便最终得到以下给定值。这个连接既可以是某种连接查询,也可以是基于这两个表创建一个全新的表

+-------+--------+-------+
| ItemA | SeqNoA | ItemB |
+-------+--------+-------+
| D     |      1 | A     |
| A     |      2 | D     |
| Z     |      3 | C     |
| B     |      4 | A     |
| A     |      5 | B     |
| K     |      6 | J     |
+-------+--------+-------+

【问题讨论】:

  • 什么是将TableB中的D连接到TableA中的A?
  • Seqno 列应该是两个表之间的公因子,但是由于某些软件错误,该列缺少 TableA 中的一些条目
  • 如果您要交换 TableA 中的第 2 行和第 3 行,您会期望结果在您的最终表中发生变化吗?如果是:那么你有一个真正的问题。一般来说,顺序不会保存在数据库中,所以这两种情况是无法区分的,所以不应该给你不同的结果。如果不是:那么这些行应该按照什么标准匹配?

标签: sql join sql-server-2012 records


【解决方案1】:

SeqNoA 列中的缺失值的值为 0。如果您的表中没有主键,您可以通过为 TableA 中的每一行分配一个唯一的序列号来编写如下查询:

select TA.ItemA , TA.NewSeqNoA as SeqNoA , TB.ItemB 
from 
(
select ItemA, SeqNoA , ROW_NUMBER() over (order by (select 1)) as NewSeqNoA
from tableA ) TA
join tableB TB on TA.NewSeqNoA = TB.SeqNoB 

但是如果你在 tableA 中有一个主键,那么你可以修改这个查询,如下所示,给你正确的行号:

select TA.ItemA , TA.NewSeqNoA as SeqNoA , TB.ItemB 
from 
(
select ItemA, SeqNoA , ROW_NUMBER() over (order by ('TableA PK')) as NewSeqNoA
from tableA ) TA
join tableB TB on TA.NewSeqNoA = TB.SeqNoB 

【讨论】:

    【解决方案2】:
    ON tableB.SeqNo = ISNULL(tableA.SeqNo,tableB.SeqNo)
    

    【讨论】:

    • Isnull 在这里不起作用,因为 SeqNoA 列中的缺失值的值为 0 而不是 null。
    • 是的,该查询没有给出预期的结果。无论如何,感谢格里戈里耶夫的努力
    猜你喜欢
    • 2016-08-29
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    相关资源
    最近更新 更多