【问题标题】:Teradata syntax: unicode delimited identifierTeradata 语法:Unicode 分隔标识符
【发布时间】:2015-07-28 23:41:49
【问题描述】:

尝试在 Teradata 13.0 中运行查询时出错 如何编写此查询?我将此 oracle 查询转换为 Teradata 查询:

select sb.name,
       sb.address1, 
       sb.address2, 
       sb.city, 
       sb.stateprovince,
       sb.postalcode, 
       sb.country, 
       sb.cid, 
       sb.item, 
       sb.mcnum, 
       sb.dmh, 
       sb.hy, 
       sb.firstname, 
       sb.lastname, 
       sb.email, 
       sb.monikerexec, 
       sb.res,
 (select cid from (select * from abc.submissions where res is not null order by res asc) where name = sb.name and item <> sb.item and res < sb.res and rownum =1) as mins,
  (select min(price) from ap.hist where name = sb.name) as minauc,
       sb.cat, 
       sb.uni
 from abc.submission sb
order by sb.item

错误:

【问题讨论】:

  • 您需要该派生表的别名(select cid from (select * from abc.submissions where res is not null order by res asc) AS ALIASNAME where name = sb.name and item &lt;&gt; sb.item and res &lt; sb.res and rownum =1) as mins
  • @JNevill 如果我这样做,它会给出 order by 错误,不能在子查询错误中使用,我需要 order by,因为那里有 rownum =1 条件。
  • 无论您是否提供别名,都不能在子查询中排序。通过不提供别名,您可以从一个问题变成两个问题。我怀疑这里的窗口功能会更好。如果有人不打败我,我会看看我能不能做点什么。

标签: teradata


【解决方案1】:

听起来问题不在于缺少别名(这是一个问题),而是需要在子查询中使用ORDER BY,以便可以在SELECT 语句中的第一个子查询 minauc

您可以使用QUALIFY,而不是执行ORDER BY 并尝试获取第一条记录,它使用窗口函数来选择您想要的记录:

SELECT 
    sb.NAME, 
    sb.address1, 
    sb.address2, 
    sb.city, 
    sb.stateprovince, 
    sb.postalcode,
    sb.country, 
    sb.cid, 
    sb.item, 
    sb.mcnum, 
    sb.dmh, 
    sb.hy, 
    sb.firstname, 
    sb.lastname, 
    sb.email, 
    sb.monikerexec, 
    sb.res,
    sb2.cid AS mins, 
    (
        SELECT min(price)
        FROM ap.hist
        WHERE NAME = sb.NAME
    ) AS minauc, 
    sb.cat, 
    sb.uni
FROM abc.submission sb
    LEFT OUTER JOIN abc.Submission sb2 ON
    sb.name = sb2.name AND
    sb.item <> sb.item AND
    sb2.res < sb.res AND
    sb2.res IS NOT NULL
QUALIFY ROW_NUMBER() OVER (PARTITION BY sb.name ORDER BY res asc) = 1

这使用 JOIN 将记录放在一起,然后,使用 QUALIFY 只允许通过具有最低 res 的连接记录。

【讨论】:

  • 两者都不起作用:错误:子查询中不允许有序分析函数,子查询中不支持前 n 个选项
  • 我刚刚通过将查询切换为使用 JOIN 进行了相当大的编辑。然后将 QUALIFY 粘贴在主查询上,这样 Teradata 就不会犹豫。我相信这在功能上与您在上面尝试的相同。
  • 感谢@jnevill 这行得通.. 但是如果我想扩展这个查询说还有一个语句添加到它与另一个相同但不同的表那么如何使用限定? select custid from (select * from ap.ahist wherebid is not null order by bid desc) where name = sb.name and rownum =1) as custid
  • 您可以使用相同的逻辑将该表加入 (ON sb.name = ap.name AND ap.bid IS NOT NULL),然后您的 Qualify 需要以更复杂的方式进行 ORDER BY。 ORDER BY bid DESC, res ASC 这应该可以,但您可能需要稍微考虑一下。如有疑问,请关闭 QUALIFY,专注于特定的 sb.name 并找出您想要的众多记录中的哪条记录,并塑造您的 QUALIFY 以匹配。可能还有其他方法可以做到这一点,所以如果您的查询不断增长并且您开始看到一些令人讨厌的笛卡尔连接发生,那么您将不得不进行更多试验。
猜你喜欢
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 2011-02-06
相关资源
最近更新 更多