SQL Server挂起查询2个独立表
我正在查询两个独立的表,但是相关的数据 查询如下:SQL Server挂起查询2个独立表,sql,sql-server,Sql,Sql Server,我正在查询两个独立的表,但是相关的数据 查询如下: select STDEV(M1.[Close]) as M1, STDEV(M2.[Close]) as M2 from M1, M2; 我想在单独的列上显示两个标准偏差数据 但是SQL Server挂起并停止移动。为什么呢?这是一个非常简单的查询 我如何在不跨越两张桌子的情况下做到这一点?桌子很大。你可以用这个 SELECT (SELECT STDEV(M1.[Close]) from M1) as M1 ,
select
STDEV(M1.[Close]) as M1, STDEV(M2.[Close]) as M2
from
M1, M2;
我想在单独的列上显示两个标准偏差数据
但是SQL Server挂起并停止移动。为什么呢?这是一个非常简单的查询
我如何在不跨越两张桌子的情况下做到这一点?桌子很大。你可以用这个
SELECT
(SELECT STDEV(M1.[Close]) from M1) as M1 ,
(SELECT STDEV(M2.[Close]) from M2) as M2;
我明白你们在说什么,但我只是想更多地了解SQL背后的工作原理 如果 结果与
from A cross join B
那为什么
select STDEV(M1.[Close]) as M1 from M1, M2;
过程如此之快,但
select STDEV(M1.[Close]) as M1, STDEV(M2.[Close]) as M2 from M1, M2;
需要永远吗
两个查询都需要先创建多个2个表。大型表上的交叉连接可能会对性能产生影响。
虽然有一些罕见的情况下,它们是有用的,但最好避免它们 Serkan使用两个嵌套子查询的答案是这个问题的最佳解决方案。
简短易懂 但要从两个不相关的表中获得结果,还可以使用UNIONALL和占位符值
SELECT
SUM(StddevM1) AS M1,
SUM(StddevM2) AS M2
FROM
(
SELECT STDEV(M1.Close) as StddevM1, 0 AS StddevM2
FROM M1
UNION ALL
SELECT 0, STDEV(M2.Close)
FROM M2
) q;
仔细想想,这里实际上可以使用交叉连接;)
你在做一个巨大的交叉积。为什么不全部联合呢?或者选择子查询。您正在表上执行
交叉连接
,您称之为“巨大”(这并没有多大意义)。如果它们真的很大(每行有数百万行?),那么当然需要很长时间。例如,如果每个表只有100000行,您将创建1000000000(100000²)行!感谢您的回答,Union不会合并数据吗?如果从A开始,B等于交叉连接B,那么为什么选择STDEV(M1.[Close])作为从M1开始的M1,M2;可以非常快速地处理吗?我猜sql优化器在您的fast示例中只是去掉了M2,因为它知道它不需要M2
SELECT
SUM(StddevM1) AS M1,
SUM(StddevM2) AS M2
FROM
(
SELECT STDEV(M1.Close) as StddevM1, 0 AS StddevM2
FROM M1
UNION ALL
SELECT 0, STDEV(M2.Close)
FROM M2
) q;
SELECT q1.M1, q2.M2
FROM (SELECT STDEV([Close]) as M1 FROM M1) q1
CROSS JOIN (SELECT STDEV([Close]) as M2 FROM M2) q2;