忽略从数据库中提取的冗余值

时间:2012-04-09 12:18:58

标签: java sql database oracle11g duplicate-removal

以下是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中出现两次,其中我们只需要一行并忽略这种重复行(在 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代码中获取多余的重复行?

2 个答案:

答案 0 :(得分:3)

如果这仅仅是将(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会确保最终结果中没有行。

答案 1 :(得分:0)

你可以尝试类似的东西:

select 
distinct bug_id from
(
    select bug_id as bug_id from TABLE
 union
    select linked_bug_id as bug_id from TABLE
)