Sql server 2012 SQL内部参照计算值进行选择

Sql server 2012 SQL内部参照计算值进行选择,sql-server-2012,Sql Server 2012,这几乎奏效了 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', (CAS

这几乎奏效了

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
服务器返回一个错误:

列名宽度比无效 列名高度比无效

这些列是在外部选择中计算的。例如,如果我引用两个非计算列doID和dotID,我的查询将运行

我想我把内部select的语法搞砸了。这将在SQL Server 2008 R2 v10.50.2550上运行

我离正确的内部列语法不远了。例如,如果我跑步

SELECT * 
FROM (VALUES (1,2), (5,3), (1,4)) AS tableOfValues (columnName1, ColumnName2)
我明白了


如果您能提供语法帮助,以引用外部select中的计算列,我将不胜感激。如果你能告诉我正确的英文来表示内部选择、外部选择和计算列,那将是一个额外的奖励

这里需要理解的重要一点是,你的逻辑是行不通的。不能在主查询中选择值,在本例中,是从子选择或内联查询中选择widthRatio和heightRatio,因为它超出了该查询的范围。知道您将要做的是创建一个内联查询,并将其加入到主查询中

您的内联查询应该如下所示

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 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
关于子选择的名称,请参见此处:


您能否澄清MaxRatio的预期结果?看起来它当前的设计目的是从包含widthRatio和heightRatio值的列中选择一个最大的比率。另一方面,您的工作示例似乎希望选择两个单独的值。每行的MaxRatio结果应该是什么?是的,没错。我需要两个中较大的一个。谢谢我需要两个宽高比中较大的一个。工作样本证明了内部选择的可行性,但其中的两个值不是我预期结果的一部分。谢谢当你说二者中的较大者时,你是指每一个ID还是总ID?每一行两个中的较大者。显然,你在这方面付出了很多努力,这是非常感谢的