【问题标题】:Joining a calculated field to a field in another table将计算字段连接到另一个表中的字段
【发布时间】:2015-02-03 12:42:52
【问题描述】:

我创建了一个名为 Table_A 的变量表,它有两列,Age 和 Age_Range。 Age 的数据类型是整数。

下一个阶段是一个 select 语句,我从 Table_B 中提取 Order_Number 和一个计算字段。我想将 Table_B 中的计算字段与 Table_A 中的 Age 连接起来,以便我可以查看计算字段及其订单号的范围。

我的第一次尝试是:

SELECT Order_Number, DATEDIFF(DAY,Order_Date,CAST(GETDATE()AS DATE)) AS Ageing, Age_Range
FROM Table_B LEFT JOIN Table_A ON Table_B.Ageing = Table_A.Age_Range

这不起作用,我明白为什么。通常在 Access 中,我只会使用计算字段构建第一个查询,然后构建第二个查询,将计算字段与表中的所需字段连接起来。我一直在查看子查询和派生表,我相信这可以解决我的问题,但我没有任何运气。我知道这是一个基本问题,但我刚刚开始使用 SQL。

谢谢

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    你不能这样加入,因为 SELECT 是在 JOIN 语句之后执行的。 你可以在这里阅读:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/70efeffe-76b9-4b7e-b4a1-ba53f5d21916/order-of-execution-of-sql-queries

    您可以使用 CROSS APPLY 解决方法

    SELECT Order_Number
        , T.Ageing
        , A.Age_Range
    FROM Table_B AS B
    CROSS APPLY (SELECT DATEDIFF(DAY, B.Order_Date, GETDATE())) AS T(Ageing)
    LEFT JOIN Table_A AS A
        ON T.Ageing = Table_A.Age_Range
    

    【讨论】:

      【解决方案2】:

      如果不需要代码的美感:

      SELECT Order_Number, DATEDIFF(DAY,Order_Date,CAST(GETDATE()AS DATE)) AS Ageing, Age_Range
      FROM Table_B LEFT JOIN Table_A ON DATEDIFF(DAY,Order_Date,CAST(GETDATE()AS DATE)) = Table_A.Age_Range
      

      否则,请按照已建议的方式使用 CROSS APPLY(性能将相同)。顺便说一句,你不需要 CAST getdate() 到日期,没有它 DATEDIFF 也可以工作,所以你可以很容易地这样写:

      SELECT Order_Number, DATEDIFF(DAY,Order_Date,GETDATE()) AS Ageing, Age_Range
      FROM Table_B LEFT JOIN Table_A ON DATEDIFF(DAY,Order_Date,GETDATE()) = Table_A.Age_Range
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-20
        • 1970-01-01
        • 1970-01-01
        • 2016-09-05
        • 2017-10-16
        • 2011-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多