【发布时间】: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