【问题标题】:Simulate a table with multiple rows just with SELECT statement仅使用 SELECT 语句模拟具有多行的表
【发布时间】:2013-04-05 11:17:44
【问题描述】:

如果我可以执行以下选择语句来创建一个具有一个值的表

 SELECT 'myname' AS 'Name' 

这将返回一个列 = Name 和一个值 = myname 的表

我该如何解决这个问题,以便仅从 select 语句中返回具有多个值的一列

我不想这样做:

 DECLARE @tmp TABLE (Name varchar(50)) 

 INSERT INTO @tmp (Name) VALUES ('myname1'),('myname2') 
    SELECT * FROM @tmp

只要从单个 SELECT 语句中(如果可能)

【问题讨论】:

    标签: sql tsql sql-server-2008-r2


    【解决方案1】:

    如果您想仅使用 SELECT 语句模拟具有多行的表,通常可以使用 UNION of rows 来完成:

    SELECT 'myname1' AS 'Name' UNION
    SELECT 'myname2' UNION
    SELECT 'myname3'
    -- etc
    

    演示:http://www.sqlfiddle.com/#!3/d41d8/12433

    【讨论】:

    • 好主意,我不会考虑这样做 :) 谢谢
    • 使用UNION 根本不是最好的方法。这不应该是公认的答案。
    【解决方案2】:

    或者,您可以在 SELECT 中使用多个 VALUES,例如:

    SELECT [Name]
    FROM (VALUES ('myname1'),('myname2')) AS X([name])
    

    【讨论】:

    • 这是最好的方法,应该是公认的答案。
    • 我不知道您可以简单地将 VALUES 直接提供到 FROM 子句中;这很优雅。
    【解决方案3】:

    如果您想像示例中那样模拟顺序数据。您可以定义递归 CTE 并将其用作表格。

    以下代码将生成 10 条记录

    ;With Users as
    (
        Select 1 as ID, CAST('Username1' AS varchar(25)) as Name
            union all
        Select ID + 1 , CAST('Username'+CAST(ID+1 AS varchar(5) ) AS varchar(25))
            from Users
            where ID < 10
    )
    SELECT * FROM Users
    

    这里是 SQL Fiddle http://www.sqlfiddle.com/#!3/d41d8/12452

    但是CTE不能在多个语句中使用。如果需要在多个语句中使用。然后将数据从 CTE 插入到临时表或表变量中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多