首页  >  问答  >  正文

如何通过不同列中可以为 NULL 的键将表连接到自身

我有一个数据集(示例 5 个字段)如下。

开始日期 时间 数字1 数字2 键1 键2
2022年11月21日 0:01 1668969012 413027032418217 B3B820CE
2022年11月21日 0:02 B3B820CE
2022年11月21日 0:03 1668969013 413027032418218 8EFCB769
2022年11月21日 0:04 8EFCB769
2022年11月21日 0:05 1668969014 413027032418219 4070A788

正如您所看到的,前两行和后两行可以通过使用 key1 和 key2 中的字符串进行耦合。但对于最后一个字段,没有任何匹配字段。

基本上我需要匹配这些对并创建一个新表,如下所示。

开始日期 时间 结束日期 时间 数字1 数字2
2022年11月21日 0:01 2022年11月21日 0:02 1668969012 413027032418217
2022年11月21日 0:03 2022年11月21日 0:04 1668969013 413027032418218
2022年11月21日 0:05 1668969014 413027032418219

这是我到目前为止所尝试的。但这并没有提供我所需要的。有人可以告诉我这里的错误是什么吗?

SELECT 
    t1.start_date_time, t2.start_date_time AS end_date_time, t1.number1, t1.number2
FROM details_all AS t1
    JOIN details_all AS t2
      ON t1.key1 = t2.key2

P粉448346289P粉448346289380 天前568

全部回复(1)我来回复

  • P粉278379495

    P粉2783794952023-09-10 09:53:30

    错误很简单 - INNER JOIN 将仅选择完整的对。

    您必须在单独的子查询中收集所有键值,然后将数据加入其中。

    SELECT t1.start_date_time,t2.start_date_time as end_date_time,t1.number1,t1.number2
    FROM ( SELECT key1 AS key FROM table
           UNION                           -- combine columns values and remove duplicates
           SELECT key2 AS key FROM table
           ) all_keys
    LEFT JOIN table t1 ON all_keys.key = t1.key1
    LEFT JOIN table t2 ON all_keys.key = t2.key2

    如果 key1 值始终存在,而 key2 中的相同值可能不存在,那么您可以使用简单的 LEFT JOIN:

    SELECT t1.start_date_time,t2.start_date_time as end_date_time,t1.number1,t1.number2
    FROM      table t1
    LEFT JOIN table t2 ON t1.key1 = t2.key2

    回复
    0
  • 取消回复