尝试使用查询填充列

时间:2015-11-04 06:12:26

标签: sql-server

所以我正在为我的一个班级做一个数据挖掘项目。作为其中的一部分,我尝试将Min Max Normalization应用于某些数据 - 这是最简单的部分。困难的部分实际上是将查询结果插入到表中。

首先,我尝试了INSERT INTO语句......

insert into dbo.CountsA([TotalCountMinMAx])
SELECT
1.00*(TotalCount-MinCount)/CountRange as TotalCountMinMax
FROM
(
SELECT
   TotalCount,
   MIN(TotalCount) OVER () AS MinCount,
   MAX(TotalCount) OVER () - MIN(TotalCount) OVER () AS CountRange
FROM
   dbo.CountsA
) X

子查询本身工作正常,但是当我尝试将结果插入表中时,它只插入了许多空记录。因此,而不是更新TotalCountMinMAx列中的十个条目,它创建了十个额外的记录,并将所有列设置为NULL。

在试图解决这个问题之后,我尝试使用UPDATE查询。

update dbo.CountsA
set [TotalCountMinMAx]=(
SELECT
1.00*(TotalCount-MinCount)/CountRange as TotalCountMinMax
FROM
(
SELECT
   TotalCount,
   MIN(TotalCount) OVER () AS MinCount,
   MAX(TotalCount) OVER () - MIN(TotalCount) OVER () AS CountRange
FROM
   dbo.CountsA
) X)

此查询无法完全运行。

"子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。"

此时,如果没有挖掘我的旧SQL书,并且基本上从头开始重新学习SQL(我非常非常生疏),我就没有想过让这些代码中的任何一个工作。

2 个答案:

答案 0 :(得分:0)

在案例1中,当您插入时,数据将在旧数据下方添加行。例如,如果您的表格如下:

ID | Col
1     2
2     4

仅插入Col列值后:3,4 你的桌子是这样的:

ID | Col
1     2
2     4
NULL  3
NULL  4

案例2: 如果您使用子查询插入如下:

UPDATE Your_Table
SET Col = (<sub-query>)

子查询必须返回单个值。

您可以添加where子句使子查询返回单个值,如下所示:

UPDATE Your_Table
SET Col = (SELECT ... FROM Your_Table) AS A
WHERE Col_ID = A.Col_ID

答案 1 :(得分:0)

问题是您关联您的sub-query,这是子查询重新调整多行错误的原因。

尝试使用CTE更新哪个更容易,更易读。

;WITH cte
     AS (SELECT 1.00 * ( TotalCount - MinCount ) / CountRange AS TotalCountMinMax_N,
                TotalCountMinMax
         FROM   (SELECT TotalCount,
                        TotalCountMinMax,
                        Min(TotalCount)
                          OVER ()             AS MinCount,
                        Max(TotalCount)
                          OVER () - Min(TotalCount)
                                      OVER () AS CountRange
                 FROM   dbo.CountsA) X)
UPDATE cte
SET    TotalCountMinMax = TotalCountMinMax_N