【问题标题】:SQL syntax: select only if more than X resultsSQL 语法:仅当超过 X 个结果时才选择
【发布时间】:2013-08-09 02:33:00
【问题描述】:

我有一个名为 measures 的测量表。该表有一列表示位置,另一列表示对应的(示例已简化)。

表格看起来像(注意 loc1 的 2 个条目):

location | value
-----------------
loc1     | value1
loc1     | value2
loc2     | value3
loc3     | value4
loc4     | value5

我现在想制定一个 SQL 查询(实际上我使用 sqlite),它只返回表的前两行(即 loc+value1 和 loc1+value2),因为这个位置在这个表中有多个条目。

伪文本公式是:显示位置的行,它们在整个表中出现多次
伪代码:

SELECT * from measures WHERE COUNT(location over the whole table) > 1

解决方案可能非常简单,但不知何故我似乎无法破解。

到目前为止,我有一个 SELECT 语句,它返回具有多个条目的位置。作为下一步,我将需要与此查询返回的位置相对应的所有行:

SELECT location FROM measures GROUP BY location HAVING count(*) > 1

所以下一步我尝试对同一个表进行 JOIN 并合并上述查询,但结果不正确。我试过这样,但这是错误的:

select t1.location, t1.value
from 
     measures as t1
     join 
     measures as t2 on t1.location = t2.location 
group by
      t2.location 
having count(*) > 1

感谢您的帮助!

【问题讨论】:

    标签: sql sqlite select


    【解决方案1】:

    这个想法是获取具有多个值的位置列表。以下使用in 获取记录:

    select m.*
    from measures m
    where m.location in (select location from measures group by location having count(*) > 1);
    

    你也可以用连接来表达:

    select m.*, mdup.numdups
    from measures m join
         (select location, count(*) as numdups
          from measures
          group by location
          having count(*) > 1
         ) mdup
         on m.location = mdup.location;
    

    以这种方式进行查询的一个优点是您可以获得重复项的数量。

    【讨论】:

      【解决方案2】:

      您使用HAVING 是对的,并考虑使用自连接...只是操作顺序略有偏差...

      select m1.location, m1.value
      from measures m1
      join (
        select location
        from measures
        group by location
        having count(*) > 1
      ) m2 on m2.location = m1.location
      

      子选择获取具有多个条目的所有位置...然后再次将其连接到表以获得完整结果。

      SQL Fiddle

      【讨论】:

      • 出于兴趣,这与将 subselect 放在 where 子句中而不是使用 join 的方法在实际方面有什么区别吗?我一直认为 where 子句似乎更具可读性,对我来说感觉更自然,但我不知道是否存在性能差异或类似...
      • 谢谢!这工作顺利:) 我现在很高兴。我认为这种类型的查询有很多用例。至少我需要它:) 而且我也不知道 SQL Fiddle。似乎很好。是的,我也对哪种解决方案更好或更实用感兴趣。 JOIN 解决方案还是嵌套查询解决方案?
      • 和克里斯。请参阅此答案 (stackoverflow.com/a/18108159/973158) 以了解两种解决方案的差异。 JOIN 解决方案还允许您显示重复项的数量。
      【解决方案3】:

      使用嵌套选择:

      SELECT location,value,type,value_added
        FROM measures
        WHERE location IN
          (SELECT location FROM measures
            GROUP BY location HAVING COUNT(*)>1)
      

      (语法靠记忆,可能有点不对)

      【讨论】:

      • 这也有效。对我来说似乎比 JOIN 解决方案更直观。尽管如此,两者都产生相同的结果。谢谢!
      • 它们本质上是等价的,查询规划器/优化器应该以同样的方式执行它们。我说“应该”是因为我根本不知道 sqlite...
      【解决方案4】:
      SELECT * FROM measures WHERE
      (location) IN (
          SELECT
              location
          FROM
              measures
          GROUP BY
              location
          HAVING
              COUNT(location) > 1
      ) ORDER BY ASC
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-13
        • 1970-01-01
        • 2015-03-11
        • 1970-01-01
        • 2011-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多