【问题标题】:Remove crossed results in SQL SELECT删除 SQL SELECT 中的交叉结果
【发布时间】:2021-12-06 16:33:00
【问题描述】:

我正在连接同一个表的两个实例,以查看与相同序列号和日期匹配但 ID 不同的记录。目的是识别冲突。我的查询是:

SELECT DISTINCT
  t1.id,
  t1.status,
  t1.date,
  t1.serial,
  t2.id_2,
  t2.status_2,
  t2.date_2,
  t2.serial_2
  FROM table AS t1 INNER JOIN table AS t2 ON t1.serial = t2.serial_2
  WHERE t1.date = t2.date_2 AND t1.id <> t2.id_2
  ORDER BY t1.date, t1.id;

此查询结果如下:

id status date serial id_2 status_2 date_2 serial_2
01 VALID 01/13/2021 0001 02 VALID 01/13/2021 0001
02 VALID 01/13/2021 0001 01 VALID 01/13/2021 0001
03 VALID 02/10/2021 0005 04 VALID 02/10/2021 0005
04 VALID 02/10/2021 0005 03 VALID 02/10/2021 0005
05 VALID 02/15/2021 0007 06 VALID 02/15/2021 0007
06 VALID 02/15/2021 0007 05 VALID 02/15/2021 0007

结果显示同一冲突的两条记录。以第 1 行和第 2 行为例,可以注意到与 ID 的 01 和 02 相关的序列 0001 与 01/13/2021 的冲突相同。

如何消除重复,为每个冲突保留一行?

谢谢。

【问题讨论】:

  • 你能否也指定预期的结果,让事情更清楚。
  • @jarlh,预期结果是第 1、3 和 5 行(奇数 ID)。第 2、4 和 6 行在同一日期引用相同的序列号(偶数 ID 的相同冲突)。谢谢。

标签: sql database select


【解决方案1】:

您可以将 id 比较为

SELECT 
  t1.id,
  t1.status,
  t1.date,
  t1.serial,
  t2.id_2,
  t2.status_2,
  t2.date_2,
  t2.serial_2
  FROM table AS t1 
  INNER JOIN table AS t2 
      ON t1.serial = t2.serial_2
      AND t1.date = t2.date_2 
      AND t1.id < t2.id_2
  ORDER BY t1.date, t1.id;

你也可能不需要distinct m 取决于你的数据看起来如何。

【讨论】:

  • 谢谢你的回答。
  • @marcoarib 不客气,如果有帮助请接受/点赞
猜你喜欢
  • 2015-03-15
  • 2017-03-20
  • 2022-11-29
  • 2015-09-01
  • 1970-01-01
  • 2018-09-11
  • 2021-12-26
  • 2018-04-19
  • 1970-01-01
相关资源
最近更新 更多