如何基于可为NULL的不同列键实现SQL表自连接并关联数据
问题分析:关联并合并带匹配Key的数据集
原始数据集
| Start Date | Time | number1 | number2 | key1 | key2 |
|---|---|---|---|---|---|
| 11/21/2022 | 0:01 | 1668969012 | 413027032418217 | B3B820CE | |
| 11/21/2022 | 0:02 | B3B820CE | |||
| 11/21/2022 | 0:03 | 1668969013 | 413027032418218 | 8EFCB769 | |
| 11/21/2022 | 0:04 | 8EFCB769 | |||
| 11/21/2022 | 0:05 | 1668969014 | 413027032418219 | 4070A788 |
如上表,前两行、中间两行可通过key1与key2的字符串关联,最后一行无匹配项。需要合并为以下结果:
期望结果
| Start Date | Time | End Date | Time | number1 | number2 |
|---|---|---|---|---|---|
| 11/21/2022 | 0:01 | 11/21/2022 | 0:02 | 1668969012 | 413027032418217 |
| 11/21/2022 | 0:03 | 11/21/2022 | 0:04 | 1668969013 | 413027032418218 |
| 11/21/2022 | 0:05 | 1668969014 | 413027032418219 |
你尝试的SQL
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
问题所在
- 连接类型错误:使用的是内连接(
JOIN,即INNER JOIN),这种连接只会保留两边都有匹配的记录,直接过滤掉了最后一行无匹配项的记录,不符合保留无匹配行的需求。 - 字段名错误:原始数据集中日期和时间是分开的
Start Date和Time字段,但SQL中使用了不存在的start_date_time字段,导致无法正确获取数据。 - 输出格式不符:需求需要分别输出开始日期、开始时间、结束日期、结束时间四个字段,而当前SQL将日期时间合并为一个字段输出,不符合预期结构。
修正后的SQL
SELECT t1.`Start Date` AS `Start Date`, t1.`Time` AS `Start Time`, t2.`Start Date` AS `End Date`, t2.`Time` AS `End Time`, t1.number1, t1.number2 FROM details_all AS t1 LEFT JOIN details_all AS t2 ON t1.key1 = t2.key2 WHERE t1.key1 IS NOT NULL AND t1.key1 != ''
说明
- 改用
LEFT JOIN,确保保留t1中所有带有效key1的记录,即使t2中没有匹配的key2。 - 正确拆分并输出
Start Date、Time字段,对应开始和结束的日期时间。 - 添加
WHERE条件过滤掉t1中无key1的记录(即那些作为结束标记的行,比如时间0:02、0:04的行,无需作为主行输出)。
内容的提问来源于stack exchange,提问作者Pathi
相关产品推荐
相关产品推荐

