【发布时间】:2021-10-08 10:31:29
【问题描述】:
我有一个可以包含“几乎”重复行的 sqlite 表。
存在这些“重复”时的唯一区别是其中一行在外键列中具有 NULL 值:-
表格的简化版本如下:-
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
在上面的例子中,我需要选择的行是
NAME FK1 FK2 WATCH
AAAAAAAA 8008 10099999 1
CCCCCCCC 2222 75656463 1
GGGGGGGG 4224 70099999 1
例如WATCH = 1 并且存在“重复”FK2 行的任何行我都需要 FK1 不为空的地方
还有另一种情况,虽然必须处理相同的 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
在上面的例子中,我需要选择的行是
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)
是最好的方法吗?
【问题讨论】:
标签: sql sqlite group-by max sql-null