【问题标题】:exclude records in sqlite subquery排除 sqlite 子查询中的记录
【发布时间】:2013-08-15 12:17:22
【问题描述】:

根据这篇文章,我得到了从组(块)中选择随机记录的查询。 (背景见Select random record within groups sqlite) 但我意识到我需要排除新字段“qcinfo”设置为“Y”的行。

这当然会在随机 ID 达到 qcinfo = 'Y' 的位置时隐藏行,这是错误的。我需要从块中排除该行,但如果任何记录具有 qcinfo 'Y',仍会为该块生成随机记录。

select  t.chunk ,t.id, t.qcinfo, t.link from  table1
inner join
        (
        select chunk ,cast(min(id)+abs(random() % (max(id)-min(id)))as int) AS random_id
        from table1
        group by chunk
        ) sq
on      t.chunk = sq.chunk
and     t.id = sq.random_id
where qcinfo <> 'Y'

给定以下数据

id|link|chunk|qcinfo
2|Yes|me1|Y
3|rr|me1|
4|yy|me1|
5|uu|you2|
6|Yes|you2|Y
7|waw|you2|
8|wewe|you2|
9|eff|you2|
10|wefw|him3|
11|Yes|him3|Y
12|we|him3|
13|wefr|him3|

以下(注意注释行)给出了我需要的内容,但不排除 Y。当我在子查询中包含 WHERE 时,我没有得到任何记录,我不知道为什么。

select  t.chunk ,t.id, t.qcinfo, t.link from    marlintag t
inner join
        (
        select chunk ,cast(min(id)+abs(random() % (max(id)-min(id)))as int) AS random_id
        from    marlintag
--  where qcinfo <> 'Y'
        group by chunk ) sq
on      t.chunk = sq.chunk
and     t.id = sq.random_id

【问题讨论】:

    标签: sql sqlite random subquery


    【解决方案1】:

    将 WHERE 子句移至子查询。

    select  t.chunk ,t.id, t.qcinfo, t.link from  table1
    inner join
            (
            select chunk ,cast(min(id)+abs(random() % (max(id)-min(id)))as int) AS random_id
            from table1
            where qcinfo <> 'Y'
            group by chunk
            ) sq
    on      t.chunk = sq.chunk
    and     t.id = sq.random_id
    

    【讨论】:

    • NULLS 每当您进行比较时都会被排除在外,因此您需要为此设置陷阱。试试WHERE (qcinfo &lt;&gt; 'Y' OR qcinfo IS NULL)
    • 啊哈!但现在我得到了 qcinfo = 'Y' 的记录。诡异的。想法? bit.ly/14cMWaf
    • 我也尝试只选择 NULL,但我仍然得到带有 Y 的记录。这是 SQLite 简单性质的某个方面吗?
    • 我也切换到 MySQL 并且遇到了同样的问题。
    猜你喜欢
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多