SQL 内部 select 参考计算值
SQL inner select with reference to calculated value
这几乎可以工作了……
SELECT
dbo.ObjectThumb.dotID, dbo.ObjectThumb.doID,
dbo.ObjectThumb.dotWidth, dbo.ObjectThumb.dotHeight,
dbo.Object.doWidth, dbo.Object.doHeight,
(CAST(dotWidth AS FLOAT) / CAST(doWidth AS FLOAT)) AS 'widthRatio',
(CAST(dotHeight AS FLOAT) / CAST(doHeight AS FLOAT)) AS 'heightRatio',
(SELECT Max(v) FROM (VALUES (widthRatio), (heightRatio)) AS value(v)) AS MaxRatio
FROM
dbo.ObjectThumb
INNER JOIN
dbo.Object ON Object.doID = ObjectThumb.doID
服务器returns一个错误:
Invalid column name widthRatio
Invalid column name heightRatio
这些列是在外部 select 中计算的。如果我引用两个非计算列(例如 doID 和 dotID),我的查询 运行s。
我想我搞砸了内部 select 的语法。这将是 运行 在 SQL Server 2008 R2 (v10.50.2550) 上。
我离那个内栏的正确语法不远了。例如,如果我 运行
SELECT *
FROM (VALUES (1,2), (5,3), (1,4)) AS tableOfValues (columnName1, ColumnName2)
我明白了
1 2
5 3
1 4
我将不胜感激在引用外部 select 中的计算列的语法方面的帮助。如果你能告诉我正确的英语来指示 inner-select、outer-select 和计算列,那将是一个奖励!
这里要理解的重要一点是你的逻辑是行不通的。您不能 select 主查询中的值,在这种情况下,widthRatio
和 heightRatio
来自子 select 或内联查询,因为它超出了该查询的范围.知道您想要做的是创建一个您将加入主查询的内联查询。
您的内联查询应如下所示
Select ObjectThumb.doID As 'LinkID',
(CAST(dotWidth AS FLOAT) / CAST(doWidth AS FLOAT)) AS 'Ratio'
From ObjectThumb
INNER JOIN Object ON Object.doID = ObjectThumb.doID
Union
Select ObjectThumb.doID,
(CAST(dotHeight AS FLOAT) / CAST(doHeight AS FLOAT))
From ObjectThumb
INNER JOIN Object ON Object.doID = ObjectThumb.doID
然后您可以像这样加入您的内联查询
SELECT ObjectThumb.dotID,
ObjectThumb.doID,
ObjectThumb.dotWidth,
ObjectThumb.dotHeight,
Object.doWidth,
Object.doHeight,
(CAST(dotWidth AS FLOAT) / CAST(doWidth AS FLOAT)) AS 'widthRatio',
(CAST(dotHeight AS FLOAT) / CAST(doHeight AS FLOAT)) AS 'heightRatio',
Max(AllRatioTable.Ratio) As MaxRatio
From ObjectThumb
INNER JOIN Object ON Object.doID = ObjectThumb.doID
Inner Join (Select ObjectThumb.doID As 'LinkID',
(CAST(dotWidth AS FLOAT) / CAST(doWidth AS FLOAT)) AS 'Ratio'
From ObjectThumb
INNER JOIN Object ON Object.doID = ObjectThumb.doID
Union
Select ObjectThumb.doID,
(CAST(dotHeight AS FLOAT) / CAST(doHeight AS FLOAT))
From ObjectThumb
INNER JOIN Object ON Object.doID = ObjectThumb.doID
) As AllRatioTable
On ObjectThumb.doID = AllRatioTable.LinkID
Group by ObjectThumb.dotID,
ObjectThumb.doID,
ObjectThumb.dotWidth,
ObjectThumb.dotHeight,
Object.doWidth,
Object.doHeight
还有关于如何称呼您的子select的话题,请看这里:
这几乎可以工作了……
SELECT
dbo.ObjectThumb.dotID, dbo.ObjectThumb.doID,
dbo.ObjectThumb.dotWidth, dbo.ObjectThumb.dotHeight,
dbo.Object.doWidth, dbo.Object.doHeight,
(CAST(dotWidth AS FLOAT) / CAST(doWidth AS FLOAT)) AS 'widthRatio',
(CAST(dotHeight AS FLOAT) / CAST(doHeight AS FLOAT)) AS 'heightRatio',
(SELECT Max(v) FROM (VALUES (widthRatio), (heightRatio)) AS value(v)) AS MaxRatio
FROM
dbo.ObjectThumb
INNER JOIN
dbo.Object ON Object.doID = ObjectThumb.doID
服务器returns一个错误:
Invalid column name widthRatio
Invalid column name heightRatio
这些列是在外部 select 中计算的。如果我引用两个非计算列(例如 doID 和 dotID),我的查询 运行s。
我想我搞砸了内部 select 的语法。这将是 运行 在 SQL Server 2008 R2 (v10.50.2550) 上。
我离那个内栏的正确语法不远了。例如,如果我 运行
SELECT *
FROM (VALUES (1,2), (5,3), (1,4)) AS tableOfValues (columnName1, ColumnName2)
我明白了
1 2
5 3
1 4
我将不胜感激在引用外部 select 中的计算列的语法方面的帮助。如果你能告诉我正确的英语来指示 inner-select、outer-select 和计算列,那将是一个奖励!
这里要理解的重要一点是你的逻辑是行不通的。您不能 select 主查询中的值,在这种情况下,widthRatio
和 heightRatio
来自子 select 或内联查询,因为它超出了该查询的范围.知道您想要做的是创建一个您将加入主查询的内联查询。
您的内联查询应如下所示
Select ObjectThumb.doID As 'LinkID',
(CAST(dotWidth AS FLOAT) / CAST(doWidth AS FLOAT)) AS 'Ratio'
From ObjectThumb
INNER JOIN Object ON Object.doID = ObjectThumb.doID
Union
Select ObjectThumb.doID,
(CAST(dotHeight AS FLOAT) / CAST(doHeight AS FLOAT))
From ObjectThumb
INNER JOIN Object ON Object.doID = ObjectThumb.doID
然后您可以像这样加入您的内联查询
SELECT ObjectThumb.dotID,
ObjectThumb.doID,
ObjectThumb.dotWidth,
ObjectThumb.dotHeight,
Object.doWidth,
Object.doHeight,
(CAST(dotWidth AS FLOAT) / CAST(doWidth AS FLOAT)) AS 'widthRatio',
(CAST(dotHeight AS FLOAT) / CAST(doHeight AS FLOAT)) AS 'heightRatio',
Max(AllRatioTable.Ratio) As MaxRatio
From ObjectThumb
INNER JOIN Object ON Object.doID = ObjectThumb.doID
Inner Join (Select ObjectThumb.doID As 'LinkID',
(CAST(dotWidth AS FLOAT) / CAST(doWidth AS FLOAT)) AS 'Ratio'
From ObjectThumb
INNER JOIN Object ON Object.doID = ObjectThumb.doID
Union
Select ObjectThumb.doID,
(CAST(dotHeight AS FLOAT) / CAST(doHeight AS FLOAT))
From ObjectThumb
INNER JOIN Object ON Object.doID = ObjectThumb.doID
) As AllRatioTable
On ObjectThumb.doID = AllRatioTable.LinkID
Group by ObjectThumb.dotID,
ObjectThumb.doID,
ObjectThumb.dotWidth,
ObjectThumb.dotHeight,
Object.doWidth,
Object.doHeight
还有关于如何称呼您的子select的话题,请看这里: