【问题标题】:Simplify repetitive SELECT ... IN query简化重复的 SELECT ... IN 查询
【发布时间】:2015-10-27 05:21:57
【问题描述】:

我有一个表格查询

SELECT a, b, c from Tbl where [conditions] IN
    (SELECT a from Tbl where [conditions]
        GROUP BY a HAVING COUNT(*) > N)
    ORDER BY a DESC, b LIMIT 100

[conditions] 基本上是一系列 AND 语句,a 是可能重复的列。列a + b 是一个独特的组合。目前我使用GROUP BY 子句只是为了让COUNT(*) > N 工作。我想返回满足[conditions] 并且至少有N 行的列条目的行。如您所见,查询与重复条件基本相同。实现上述目标的更好方法是什么?

谢谢。

【问题讨论】:

  • 您需要指定您正在使用的确切 RDBMS 名称。
  • 我正在使用基于sqliteRDBMS
  • 如果它至少有 N 行,它应该是您在查询中使用的 >=
  • 好的,我知道,问题的关键是如何优化/最小化这个查询,这样我就不需要重复[conditions] 两次
  • [conditions] IN (SELECT a FROM... ) 不重要,除非a 是一个布尔列,因为[conditions] 返回一个布尔值。

标签: sql sqlite select


【解决方案1】:
SELECT a, b, c FROM Tbl
WHERE a IN
(SELECT a FROM Tbl
HAVING COUNT(*) > N AND CASE [conditions] THEN 1 ELSE 0 END = 1
GROUP BY a, CASE [conditions] THEN 1 ELSE 0 END); 

我猜这不是最好的选择?

SELECT a, b, c FROM Tbl
WHERE a IN (
SELECT a FROM
( SELECT a,
CASE WHEN [conditions] THEN 1 ELSE 0 END AS con FROM Tbl ) T
WHERE con = 0 
HAVING COUNT(*) > N
GROUP BY a, con);

【讨论】:

    猜你喜欢
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 2015-10-12
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    相关资源
    最近更新 更多