如何通过比较相邻行来使用 SQlite SELECT 语句 select 唯一行
How to select unique rows with SQlite SELECT statement by comparing neighbouring rows
我有一个可以包含“几乎”重复行的 sqlite table。
存在这些“重复项”时的唯一区别是其中一行在外键列中具有 NULL
值:-
简化版的table如下:-
NAME FK1 FK2 WATCH
AAAAAAAA NULL 10099999 1
AAAAAAAA 8008 10099999 1
BBBBBBBB 1111 30088888 2
CCCCCCCC 2222 75656463 1
DDDDDDDD 3333 34242434 2
GGGGGGGG NULL 70099999 1
GGGGGGGG 4224 70099999 1
在上面的示例中,我需要 select 的行是
NAME FK1 FK2 WATCH
AAAAAAAA 8008 10099999 1
CCCCCCCC 2222 75656463 1
GGGGGGGG 4224 70099999 1
例如WATCH = 1 和存在“重复”FK2 行的任何行我需要 FK1 不是 NULL
还有另一种情况,虽然相同的 SQL 语句必须处理
NAME FK1 FK2 WATCH
KKKKKKKK NULL 87656463 1
LLLLLLLL 5454 65453535 2
MMMMMMMM NULL 48723747 1
MMMMMMMM 9229 48723747 1
NNNNNNNN 2765 77000007 2
OOOOOOOO NULL 83343343 1
ZZZZZZZZ 8118 63737422 1
在上面的示例中,我需要 select 的行是
NAME FK1 FK2 WATCH
KKKKKKKK NULL 87656463 1
MMMMMMMM 9229 48723747 1
OOOOOOOO NULL 83343343 1
ZZZZZZZZ 8118 63737422 1
例如WATCH = 1 并且存在“重复”FK2 行的任何行我需要 FK1 不为空,除非只有 FK1 为空然后我需要那些行
是否可以在单个 SQLite 语句中实现?
这个声明似乎有效
SELECT T1.name, T1.fk1, T1.fk2
FROM my_table T1
WHERE T1.watch = 1
AND T1.fk1 IS NOT NULL
UNION
SELECT T2.name, T2.fk1, T2.fk2
FROM my_table T2
WHERE T2.watch = 1
AND T2.fk1 IS NULL
AND T2.fk2 NOT IN (SELECT T3.fk2 FROM my_table T3 WHERE T3.watch = 1 AND T3.fk1 IS NOT NULL)
是最好的方法吗?
你可以通过聚合来做到这一点:
SELECT NAME, MAX(FK1) FK1, FK2, WATCH
FROM my_table
WHERE WATCH = 1
GROUP BY NAME;
当在此类查询中使用聚合函数 MAX()
时,SQLite returns 返回包含最大值的行。
参见demo。
我有一个可以包含“几乎”重复行的 sqlite table。
存在这些“重复项”时的唯一区别是其中一行在外键列中具有 NULL
值:-
简化版的table如下:-
NAME FK1 FK2 WATCH
AAAAAAAA NULL 10099999 1
AAAAAAAA 8008 10099999 1
BBBBBBBB 1111 30088888 2
CCCCCCCC 2222 75656463 1
DDDDDDDD 3333 34242434 2
GGGGGGGG NULL 70099999 1
GGGGGGGG 4224 70099999 1
在上面的示例中,我需要 select 的行是
NAME FK1 FK2 WATCH
AAAAAAAA 8008 10099999 1
CCCCCCCC 2222 75656463 1
GGGGGGGG 4224 70099999 1
例如WATCH = 1 和存在“重复”FK2 行的任何行我需要 FK1 不是 NULL
还有另一种情况,虽然相同的 SQL 语句必须处理
NAME FK1 FK2 WATCH
KKKKKKKK NULL 87656463 1
LLLLLLLL 5454 65453535 2
MMMMMMMM NULL 48723747 1
MMMMMMMM 9229 48723747 1
NNNNNNNN 2765 77000007 2
OOOOOOOO NULL 83343343 1
ZZZZZZZZ 8118 63737422 1
在上面的示例中,我需要 select 的行是
NAME FK1 FK2 WATCH
KKKKKKKK NULL 87656463 1
MMMMMMMM 9229 48723747 1
OOOOOOOO NULL 83343343 1
ZZZZZZZZ 8118 63737422 1
例如WATCH = 1 并且存在“重复”FK2 行的任何行我需要 FK1 不为空,除非只有 FK1 为空然后我需要那些行
是否可以在单个 SQLite 语句中实现?
这个声明似乎有效
SELECT T1.name, T1.fk1, T1.fk2
FROM my_table T1
WHERE T1.watch = 1
AND T1.fk1 IS NOT NULL
UNION
SELECT T2.name, T2.fk1, T2.fk2
FROM my_table T2
WHERE T2.watch = 1
AND T2.fk1 IS NULL
AND T2.fk2 NOT IN (SELECT T3.fk2 FROM my_table T3 WHERE T3.watch = 1 AND T3.fk1 IS NOT NULL)
是最好的方法吗?
你可以通过聚合来做到这一点:
SELECT NAME, MAX(FK1) FK1, FK2, WATCH
FROM my_table
WHERE WATCH = 1
GROUP BY NAME;
当在此类查询中使用聚合函数 MAX()
时,SQLite returns 返回包含最大值的行。
参见demo。