SELECT Teradata 中的值

SELECT VALUES in Teradata

我知道在其他 SQL 风格 (T-SQL) 中可以 "select" 提供没有 table 的数据。喜欢:

SELECT *
FROM (VALUES (1,2), (3,4)) tbl

如何使用 Teradata 执行此操作?

Teradata 对此有奇怪的语法:

select t.*
from (select * from (select 1 as a, 2 as b) x
      union all
      select * from (select 3 as a, 4 as b) x
     ) t;

我无法访问 TD 系统进行测试,但您可以从上面的答案中删除其中一个嵌套的 SELECT:

select x.*
from (
  select 1 as a, 2 as b
  union all
  select 3 as a, 4 as b
) x

如果您需要生成一些随机行,您可以随时从系统 table 中执行 SELECT,例如 sys_calendar.calendar:

SELECT 1, 2
FROM sys_calendar.calendar
SAMPLE 10;

更新示例:

SELECT TOP 1000 -- Limit to 1000 rows (you can use SAMPLE too)
    ROW_NUMBER() OVER() MyNum, -- Sequential numbering
    MyNum MOD 7, -- Modulo operator
    RANDOM(1,1000), -- Random number between 1,1000
    HASHROW(MyNum) -- Rowhash value of given column(s)
FROM sys_calendar.calendar; -- Use as table to source rows

几个注意事项:

  • 确保您选择的系统 table 将始终存在并具有行
  • 如果您需要的行数超过源 table 中可用的行数,请执行 UNION 以获得更多行
  • 您总是可以轻松地创建一个单列 table 并通过 INSERT/SELECT 将其填充到您想要的任意行数:

    创建虚拟表(c1 INT); -- 创建table
    插入 DummyTable(1); -- 种子 table
    插入 DummyTable SELECT * FROM DummyTable; -- 运行 这可以根据需要多次复制行

然后使用此 table 创建您想要的任何结果集,类似于上面使用 sys_calendar.calendar 的查询。

我没有要测试的 TD 系统,因此您可能会遇到语法错误...但这应该能为您提供一个基本概念。

我来晚了一点,但最近遇到了同样的错误。

我通过简单地使用

解决了这个问题
select distinct 1 as a, 2 as b from DBC.tables
union all 
select distinct 3 as a, 4 as b from DBC.tables

这里,DBC.tables 是一个只有几行的数据库后端 table。因此,查询运行速度也很快