1

以下是 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 中,有两行,其中一行是多余的。例如Bug Id 3726Linked Bug Id 45326Bug Id 45326Linked Bug Id 3726在 o/p 中出现两次,其中我们只需要一行并忽略这种重复的行(其中一个值在Bug Id列或Linked Bug 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 代码中获取冗余的重复行?

4

2 回答 2

3

如果这只是将(B, A)其视为的副本,(A, B)并且您并不特别关心返回的行是否为(A, B)or (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)or (B, A)),并DISTINCT确保最终结果中没有重复行。

于 2012-04-09T13:37:13.727 回答
0

you may try something similar to this:

select 
distinct bug_id from
(
    select bug_id as bug_id from TABLE
 union
    select linked_bug_id as bug_id from TABLE
)
于 2012-04-09T14:59:38.817 回答