【问题标题】:How to select unique rows with SQlite SELECT statement by comparing neighbouring rows如何使用 SQlite SELECT 语句通过比较相邻行来选择唯一行
【发布时间】: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


    【解决方案1】:

    你可以通过聚合来做到这一点:

    SELECT NAME, MAX(FK1) FK1, FK2, WATCH
    FROM my_table
    WHERE WATCH = 1
    GROUP BY NAME;
    

    在此类查询中使用聚合函数MAX() 时,SQLite 返回包含返回最大值的行。

    请参阅demo

    【讨论】:

      猜你喜欢
      • 2019-10-17
      • 2015-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      相关资源
      最近更新 更多