代码之家  ›  专栏  ›  技术社区  ›  Mulgard

选择列,其中值出现在给定数组中,并且列值存在于所有数组项中

  •  1
  • Mulgard  · 技术社区  · 8 年前

    我正在写sql语句,但我的sql知识似乎不够复杂,无法实现我的目标。我的表结构如下:

    ID    INTERVAL
    1     2014-11-12/2014-11-19
    1     2015-11-12/2015-11-19
    2     2014-11-12/2014-11-19
    3     2016-11-12/2016-11-19
    

    现在我有一个ID数组,其中包含:

    [1, 2, 3]
    

    我想得到这些ID的所有间隔,其中每个间隔对于所有ID都存在。我从以下陈述开始:

    SELECT INTERVAL FROM INTERVALS WHERE ID IN (1, 2, 3)
    

    当然,这将返回:

    2014-11-12/2014-11-19
    2015-11-12/2015-11-19
    2014-11-12/2014-11-19
    2016-11-12/2016-11-19
    

    但是现在我只想返回那些每个id存在相同间隔的结果。所以在这种情况下,我根本不希望得到任何结果。但如果我们有这个数据集,例如:

    ID    INTERVAL
    1     2014-11-12/2014-11-19
    1     2015-11-12/2015-11-19
    2     2014-11-12/2014-11-19
    3     2014-11-12/2014-11-19
    3     2016-11-12/2016-11-19
    

    查询结果应为

    2014-11-12/2014-11-19
    

    因为对于所有给定的ID,只有这个间隔存在。 我必须如何更改sql语句才能实现这一点?

    我还尝试了:

    SELECT INTERVAL FROM INTERVALS A 
        WHERE A.ID in (1, 2, 3)
        AND EXISTS (
                    SELECT INTERVAL FROM INTERVALS B
                    WHERE A.INTERVAL = B.INTERVAL
                   )
    

    编辑

    即时消息使用 Apache Ignite Queries

    1 回复  |  直到 8 年前
        1
  •  3
  •   Denis Mekhanikov    8 年前

    你可以这样做:

    SELECT interval
    FROM intervals
    WHERE id IN(1, 2, 3)
    GROUP BY interval
    HAVING COUNT(DISTINCT id) = 3;
    

    但我不确定它是否会有好的表现。如果你想让它快速运行,你可以制作缓存,其中包含 intervals 表,复制。同时考虑更换 IN 操作员 JOIN ,如下所述: https://apacheignite-sql.readme.io/docs/performance-and-debugging#section-sql-performance-and-usability-considerations