我有一個可以包含“幾乎”重復行的 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 不是 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
在上面的例子中,我需要選擇的行是
NAME FK1 FK2 WATCH
KKKKKKKK NULL 87656463 1
MMMMMMMM 9229 48723747 1
OOOOOOOO NULL 83343343 1
ZZZZZZZZ 8118 63737422 1
例如,WATCH = 1 且存在“重復”FK2 行的任何行我需要其中 FK1 不是 NULL 除非只有 FK1 是 NULL 然后我需要這些行
這可以在單個 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)
是最好的方法嗎?
uj5u.com熱心網友回復:
您可以通過聚合來實作:
SELECT NAME, MAX(FK1) FK1, FK2, WATCH
FROM my_table
WHERE WATCH = 1
GROUP BY NAME;
MAX()在此類查詢中使用聚合函式時,SQLite 回傳包含回傳最大值的行。
請參閱演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/311414.html
標籤:sql sqlite 通过...分组 最大限度 sql-null
下一篇:創建不允許值不在另一列中的觸發器
