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

私のSQLo/ pには、2つの行があり、そのうち1つの行は冗長です。たとえばBugId3726 とLinkedBugId45326およびBugId45326LinkedBugId3726o / pに2回存在し、 そのうち1行だけが必要であり、そのような種類の重複行は無視さます(個別の値を含むo/pに影響を与えることなく、バグID列またはリンクされたバグID列)。

現在、次のクエリを使用してそのような重複行を識別できますが、このような重複行のうち1行だけが必要です。

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)(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、クエリは2つのIDを交換します。それ以外の場合、値は変更されずに返されます。したがって、(A, B)常に(B, A)重複する行を生成し(両方ともまたはのいずれかになります(A, B)(B, A)DISTINCT最終結果に何もないことを確認します。

于 2012-04-09T13:37:13.727 に答える
0

あなたはこれに似た何かを試すかもしれません:

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 に答える