下面是sql查询的示例o/p-

  BUG_ID   |  LINKED_BUG_ID
-----------|-----------------
3726       |  45236
45236      |  3726
3726       |  45254
45254      |  3726
3726       |  45402
45402      |  3726
3726       |  1182
1182       |  55745

在我的sql o/p中,有两行,其中一行是多余的。例如,错误id 3726和链接的错误id 45326以及错误id 45326和链接的错误id 3726在o/p中出现了两次,其中我们只需要一行并忽略此类重复行(在错误id列或链接的错误id列中有一个重复的值),而不会影响包含不同值的o/p。
目前,我可以使用以下查询来标识此类重复行,但在此类重复行中只需要一行。
SELECT
  BUG_ID,
  LINKED_BUG_ID,
  CASE
    WHEN BUG_ID IN (select LINKED_BUG_ID FROM MY_BUG_LINKS) AND
      LINKED_ISSUE_ID IN (SELECT BUG_ID FROM MY_BUG_LINKS)
    THEN 'true' ELSE 'false'
  END AS EQUAL
FROM MY_BUG_LINKS;

下面是我在代码中用于获取所有行(甚至包括重复行)的sql查询
SELECT BUG_ID, LINKED_BUG_ID FROM MY_BUG_LINKS;

如何避免在数据库级别本身或Java代码中获取多余的重复行?

最佳答案

如果这只是将(B, A)视为(A, B)的副本,而您并不特别关心返回的行是(A, B)还是(B, A),则可以执行以下操作:

SELECT DISTINCT
  CASE WHEN BUG_ID > LINKED_BUG_ID THEN LINKED_BUG_ID ELSE BUG_ID AS BUG_ID,
  CASE WHEN BUG_ID > LINKED_BUG_ID THEN BUG_ID ELSE LINKED_BUG_ID AS LINKED_BUG_ID
FROM MY_BUG_LINKS;

也就是说,如果BUG_ID的值大于LINKED_BIG_ID,查询将交换这两个id,否则返回的值将保持不变。因此,(A, B)(B, A)总是产生重复的行(都是(A, B)(B, A)),并且DISTINCT确保最终结果中没有任何行。

10-01 05:19
查看更多