【问题标题】:Trying to understand how WHERE IN in a subquery works in Teradata SQL?试图了解子查询中的 WHERE IN 如何在 Teradata SQL 中工作?
【发布时间】:2020-03-08 07:45:07
【问题描述】:

我正在尝试使用 where 子句中的列表构建子查询,我尝试了几种变体,我认为问题在于我构建 WHERE IN 的方式。非常感谢您的帮助!

SELECT  a.ACCT_SK, 
        a.BTN,
        a.PRODUCT_SET,
        MAX(b.ORD_CREATD_DT)

     FROM MM.MEC_ACCT_ATTR a, CDI_CRM.ORD_MSTR b

     WHERE a.ACCT_SK=b.ACCT_SK AND a.BTN=b.BTN

        (SELECT b.ACCT_SK, b.ORD_CREATD_DT
        FROM  CDI_CRM.ORD_MSTR b
        WHERE b.ACCT_SK IN ('44347714',
        '44023302',
        '43604964'));

选择失败。 3706: (-3706) 语法错误:预期在 '(' 和 'SELECT' 关键字之间有一些东西

所需的输出是一个表格,其中包含 50 个 ACCT_SK 的 Product 集,其中最近的订单日期与 ACCT_SK 和 BTN 匹配。

【问题讨论】:

  • 子查询应该只返回 1 列。
  • 子查询只能返回一列,你的语法无效。您需要将某些内容与子查询的结果进行比较。
  • 有没有办法达到我想要的结果?昨晚我阅读了有关子查询的所有内容,并认为这可能是获得所需内容的方法。我记得读它只返回一行......所以这是有道理的。我应该如何考虑这个问题?
  • 顶部 Select 中没有 WHERE IN,只是一个不相关的 #2 Select
  • 如果没有样本数据和期望的结果,我认为我们无法回答这个问题。

标签: sql subquery teradata


【解决方案1】:

样本数据和期望的结果真的很有帮助。您的查询没有多大意义,但我怀疑您想要:

SELECT a.ACCT_SK, a.BTN, a.PRODUCT_SET,
       MAX(o.ORD_CREATD_DT)
FROM MM.MEC_ACCT_ATTR a JOIN
     CDI_CRM.ORD_MSTR o
     ON a.ACCT_SK = o.ACCT_SK AND a.BTN = o.BTN
WHERE a.ACCT_SK IN ('44347714', '44023302', '43604964')
GROUP BY a.ACCT_SK, a.BTN, a.PRODUCT_SET;

这将返回三个指定帐户所需的列。

注意事项:

  • 始终使用正确、明确、标准的JOIN 语法。 切勿在FROM 子句中使用逗号。
  • 您的子查询根本没有意义。它未连接到查询中的任何其他内容。
  • 您正在使用聚合函数 (MAX()),因此您的查询是聚合查询,需要 GROUP BY
  • 使用有意义的表别名。 a 对帐户表有意义,但b 对于订单表没有意义。

【讨论】:

    猜你喜欢
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多