Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server挂起查询2个独立表_Sql_Sql Server - Fatal编程技术网

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;