来自子查询的SQL别名返回?

时间:2013-07-04 11:21:20

标签: sql stored-procedures subquery

我有一个这个程序(简化):

CREATE PROCEDURE myProcedure
    @var1 int,
    @var2 NVARCHAR(50),
    @var3 NVARCHAR(50),
    @var4 NVARCHAR(50)  
AS
BEGIN
   SELECT 
       stuff AS (SELECT date FROM dateTable WHERE condition), 
       otherStuff
       moreStuff
   FROM
       myTable
   WHERE
       myConditions;
END

它说我在两个地方的语法不正确:

  1. 第2行附近的单词SELECT
  2. 第2行附近')'
  3. 第7行附近的单词AS
  4. 我知道子查询只返回1个字符串(无论如何都会返回1个字符串。)

    在我添加子查询之前它已经工作了,所以必须要弄乱它。

    编辑:为了澄清,我想打印“stuff”中的值,但列的名称应该是我的子查询返回的,而不是相反的方式=)

    第二次编辑:

    好的,我要说我有表格:myTable1myTable2

    这是myTable1

    | stuff | otherStuff | otherStuff |
    |   x   |    x       |    x       |
    |   x   |    x       |    x       |
                 ...
    

    这是myTable2

    | date  | id |
    | x/x/x | 1  |
    | x/x/x | 2  | 
         ...
    

    这就是我希望SELECT返回的内容:

    | x/x/x | otherStuff | otherStuff |
    |   x   |    x       |    x       |
    |   x   |    x       |    x       |
    

2 个答案:

答案 0 :(得分:3)

应该是这样的:

  SELECT 
       (SELECT date FROM dateTable WHERE condition) AS stuff , 
       otherStuff
       moreStuff
   FROM
       myTable
   WHERE
       myConditions;

别名应该在相关子查询之后,假设此子查询只返回一个值。

另一种语法是这样写:

  SELECT 
       stuff = (SELECT date FROM dateTable WHERE condition), 
       otherStuff
       moreStuff
   FROM
       myTable
   WHERE
       myConditions;

更新

正如@gbn在他的回答中所说的那样,你必须使用动态SQL这样做,它没有任何意义,但如果你想以任何方式这样做,你可以这样做:

DECLARE @columnname VARCHAR(20);
DECLARE @query VARCHAR(2000);

SELECT @columnname =  QUOTENAME([date]) FROM dateTable;


SELECT @query = 'SELECT (SELECT date FROM dateTable) AS' +  @columnname + 
                 ' , otherStuff, moreStuff FROM myTable';

execute(@query);

喜欢这个:

答案 1 :(得分:3)

Alias使用AS之后或=之前

SELECT 
   stuff = (SELECT date FROM dateTable WHERE condition), 
   otherStuff
   moreStuff
FROM
   myTable
WHERE
   myConditions;

SELECT 
   (SELECT date FROM dateTable WHERE condition) AS stuff, 
   otherStuff
   moreStuff
FROM
   myTable
WHERE
   myConditions;

编辑后的问题

普通选择中不能包含动态列名。这没有任何意义,因为现在您的返回数据集因子查询而异。

您可以使用

之一
  • 使用所需别名构建查询的动态SQL
  • 添加一个充当列名称的额外列

示例:

SELECT 
   (SELECT date FROM dateTable WHERE condition) AS StuffColumnName, 
   stuff,
   otherStuff
   moreStuff
FROM
   myTable
WHERE
   myConditions;