所以我正在为我的一个班级做一个数据挖掘项目。作为其中的一部分,我尝试将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(我非常非常生疏),我就没有想过让这些代码中的任何一个工作。
答案 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