【问题标题】:Subquery on outer query外部查询的子查询
【发布时间】:2015-04-29 16:07:23
【问题描述】:

更新:请看第二个查询,这个例子更具代表性

我想为每列创建一个使用不同子查询的查询。 子查询将基于外部查询获得的列表。

例如: 考虑 tableA 是一个有 30 列和 500 万条记录的表

SELECT a, b, c,
(SELECT COUNT(a) FROM values WHERE (r = 12 AND u = 'TO') OR (r = 16 AND u IN ('TB', 'TU')) as First,
(SELECT COUNT(a) FROM values WHERE (r = 16 AND u = 'TE') OR (r = 76 AND u IN ('TE', 'TG')) as Second,
(SELECT COUNT(a) FROM values WHERE (r = 564 AND u = 'HG') OR (r = 788 AND u IN ('VD', 'BF')) as Third,
(SELECT COUNT(a) FROM values WHERE (r = 383 AND u = 'RT') OR (r = 35 AND u IN ('GR', 'EZ')) as Fourth
FROM tableA values

我知道这个查询不会执行,因为我不能从子查询中调用值,但是有没有一个好的解决方案可以让这个查询快速运行?


在某些子查询中,我还需要加入另一个表,那么是否仍然可以使用值,还是我必须再次对 tableA 进行子查询?


对于本示例,以下查询将更具代表性:

SELECT col1, col2,

(SELECT COUNT(col3) FROM tableA ta
INNER JOIN tableB b ON tl.TaskId = b.col6
INNER JOIN tableC c ON b.Id = c.TaskId
WHERE c.ResultCode = 1 AND ta.col4 = a.col4 AND ta.col5 = a.col5) as Executed,

(SELECT COUNT(col3) FROM tableA ta
INNER JOIN tableB b ON tl.TaskId = b.col6
INNER JOIN tableC c ON b.Id = c.TaskId
WHERE c.ResultCode = 9 AND ta.col4 = a.col4 AND ta.col5 = a.col5) as NotExecuted

FROM tableA a
GROUP BY col1, col2, col4, col5

【问题讨论】:

  • 所以您希望这些列仅填充b 的 4 个特定值,否则为 NULL?你能举个例子说明你希望结果集是什么样子吗?
  • 我正在处理的查询将有更复杂的 WHERE 子句,但我只是使用 b 的值作为示例。我只想要计数,所以它要么是 0,要么是一个数量。考虑到 WHERE 子句会比较复杂,我给出的例子无法表示,我会立即更正。
  • Soo,这将输出相同的四个计数,500 万次。可能不是收集这些数据的最佳方式:)
  • 确实,我会将示例查询重新创建为更具代表性的查询。
  • 我已经添加了第二个查询,这对于本示例将更具代表性。

标签: sql sql-server database sql-server-2008 sql-server-2012


【解决方案1】:
SELECT a, b, c,
       SUM(CASE WHEN a IS NOT NULL AND b=12 THEN 1 ELSE 0 END) as First,
       SUM(CASE WHEN a IS NOT NULL AND b=16 THEN 1 ELSE 0 END) as Second, 
       SUM(CASE WHEN a IS NOT NULL AND b=82 THEN 1 ELSE 0 END) as Third,
       SUM(CASE WHEN a IS NOT NULL AND b=167 THEN 1 ELSE 0 END) as Fourth
    FROM tableA        
    GROUP BY a, b, c  

【讨论】:

  • 这不是为每一行(每 4 列)输出 1 或 0 吗?
  • @Mackan:不,因为 SUM。
  • 是的,我看到了总和,但我还在总和之前看到了“SELECT a, b, c”。现在您添加了 GROUP BY,它更有意义 ;)
  • 我已经添加了第二个查询,这对于本示例将更具代表性。
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多