【问题标题】:Ignore redundant values fetched from database忽略从数据库中获取的冗余值
【发布时间】:2012-04-21 19:36:23
【问题描述】:

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

【问题讨论】:

  • 如果该行是多余的,为什么不从数据库中删除它呢?为什么它首先存在?
  • 它是否仅适用于单向的前向和后向链接{(A, B), (B, A)},或者您是否希望消除链中连接的重复项,如{(A, B), (B, C), (C, D), (D, A)}

标签: java sql database oracle11g duplicate-removal


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以尝试类似的方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      相关资源
      最近更新 更多