以下是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代码中获取多余的重复行?
答案 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
)