T-SQL在更大的SELECT语句中创建变量?有没有更快的方法?

时间:2018-12-07 20:43:07

标签: sql tsql

假设我有世界上最简单的2个表作为数据:

第一个表格如下:

enter image description here

第二张表如下:

enter image description here

然后让我们说我在T-SQL中有以下语句

SELECT  
    T1.Column1 + T2.Column1 AS 'AddedColumns'
FROM 
    Table1 AS T1, Table2 AS T2 

因此,我的结果应显示一个值分别为6和9的列,我将其别名为“ AddedColumns”

为了便于讨论,我想将表1中的第2列添加到“添加的列”中,我该怎么做?

我理解的一种方法是在顶部声明变量,但这将需要重新生成SELECT,FROM以及至关重要的是我标记的WHERE语句。有没有办法做类似的事情:

SELECT  
    T1.Column1 + T2.Column AS 'AddedColumns',
    'AddedColumns' + T2.Column2 AS 'Double Added'
FROM 
    Table1 AS T1, Table2 AS T2 

还是我只需要做类似的事情:

Declare @NewVariable Int = SELECT (..... FROM ....... WHERE......)

在每个要存储的变量的最顶部?

3 个答案:

答案 0 :(得分:1)

您可以使用cross apply

SELECT v.AddedColumn,
       v.AddedColumn + T2.Column2 AS [Double Added]
FROM Table1 T1 CROSS JOIN
     Table2 T2 CROSS APPLY
     (VALUES (T1.Column1 + T2.Column)) v(AddedColumn);

一些建议:

  • 切勿对列别名使用单引号。仅对字符串和日期常量使用单引号。
  • 切勿在{{1​​}}子句中使用逗号。 始终使用正确的,明确的,标准 FROM语法。

答案 1 :(得分:1)

戈登的示例可能就是您想要的,但是您可能想使用SQL的另一个功能,称为CTE-CTE是可以作为表重新使用的子查询。考虑下面的代码。

WITH table_a_and_square as
(
   SELECT a.col1, a.col2, a.col1*a.col1 as col1_sqr
   FROM tablea as a
), table_a_and_cube as
(
   SELECT col1, col1_sqr*col1_sqr as col1_cube
   FROM table_a_and_square 
)
SELECT ... -- a select statement with those two tables.

关于CTE的一些好处

  • 您可以无限地拥有任意数量。这样可以轻松地将SQL代码分解为较小的步骤。
  • 因为您可以随时“结束”,所以在调试时,我会将select语句放在CTE select之间,然后运行它及其上方的所有内容,以查看是否对该选择起作用。这为我提供了一种模块化的测试方法。
  • 在大多数情况下,编译器将进行优化,并且使用CTE与大型查询一样快或更快。
  • 您可以命名CTE选择的名称-这有助于记录您的代码并使其更易于理解,支持和维护。

答案 2 :(得分:0)

为什么不简单地这样呢?

using (Session session = new Session())
 {
    string FileFullPath = 
        Dts.Variables["User::FTP_FileFullPath"].Value.ToString();                                               
    session.Open(sessionOptions);                                                                   
    DateTime dateTime = DateTime.Now;                                                              
    session.MoveFile(FileFullPath, newFTPFullPath);                          
    TransferOperationResult transferResult;
    transferResult = session.GetFiles(newFTPFullPath,                                 
        Dts.Variables["User::Local_DownloadFolder"].Value.ToString(),false);                                    
    Dts.Variables["User::FTP_FileProcessDate"].Value = dateTime; 
}