【问题标题】:SELECT VALUES in Teradata在 Teradata 中选择值
【发布时间】:2018-05-11 23:19:55
【问题描述】:

我知道在其他 SQL 风格 (T-SQL) 中可以“选择”提供的数据而无需表。喜欢:

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

如何使用 Teradata 做到这一点?

【问题讨论】:

  • select 1, 2 union all select 3, 4?
  • @DmitryBychenko 作为单个语句执行。失败 [3888 : 42000] UNION、INTERSECT 或 MINUS 的 SELECT 必须引用表。语句 1:选择语句失败。
  • Gordon 向您展示了奇怪的语法,但您为什么真的需要它?
  • 主要是为另一个问题即时创建一个小的自包含数据集。在生产环境/ETL 中,您可能希望将所有信息存储在表中。像这样一个较大的查询存储一小组元组的一个优点是您可以轻松地将其保存在源代码管理中。另一个好处是您可以在这个虚拟表中使用 CURRENT_DATETIME,从而在某些情况下无需更新物理表。

标签: sql teradata


【解决方案1】:

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;

【讨论】:

  • 哇,很多嵌套。但它运行。
【解决方案2】:

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

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

如果您需要生成一些随机行,您可以随时从系统表中执行 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

几个注意事项:

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

    创建虚拟表(c1 INT); -- 创建表
    插入虚拟表(1); -- 种子表
    INSERT INTO DummyTable SELECT * FROM DummyTable; -- 运行这个来复制你想要多少次的行

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

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

【讨论】:

  • 运行此程序时出现以下错误:失败 [3807 : 42S02] 对象“sys_calendar”不存在。使用 sys_calendar.calendar 有效,但在此示例中,结果集是 10 行具有相同值。
  • 去掉嵌套层不起作用。我收到以下错误:失败 [3888 : 42000] UNION、INTERSECT 或 MINUS 的 SELECT 必须引用表。
  • 是的,sys_calendar.calendar 是您可以使用的一个系统表。您可以将此表用作行生成器,然后在这些行中创建您想要的任何数据。请参阅上面的更新示例。
【解决方案3】:

我来这个帖子有点晚了,但最近遇到了同样的错误。

我通过简单的使用解决了这个问题

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 是一个只有几行的数据库后端表。因此,查询运行速度也很快

【讨论】:

  • 这真的很糟糕,因为 dbc.Tables 是一个返回大量行的复杂视图。最好使用像select 1 as a from sys_calendar.calkendar where calendar_date = current_date 这样的单行选择(可以作为视图实现)
  • 是的,你是对的。日历表会更好。 DBC 视图仍然会很复杂,即使计算规模会更大,以做出像我这样的微不足道的改变。但对你的洞察力表示敬意:)
猜你喜欢
  • 2014-06-11
  • 1970-01-01
  • 2011-03-06
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 2020-06-02
  • 1970-01-01
相关资源
最近更新 更多