下面是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中出现了两次,其中我们只需要一行并忽略此类重复行(在错误id列或链接的错误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代码中获取多余的重复行?
最佳答案
如果这只是将(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
确保最终结果中没有任何行。