【问题标题】:DISTINCT from One table and INNER JOIN with another table in snowflakeDISTINCT from One table and INNER JOIN with another table in snowflake
【发布时间】:2021-12-17 01:30:05
【问题描述】:

我想:

  • 加入两个表
  • 从第一个表中删除“queryGroupName” = 'DELETE'
  • 从第一个表中,通过去重(distinct ID)获取Id
  • 使用此 ID,与另一个表进行内部联接
  • 对于输出,只选择第二个表

选择“表 2”。*
FROM (SELECT DISTINCT "Id" FROM DB1."PUBLIC"."TABLE1")
内部连接 ​​DB1."PUBLIC"."TABLE2" ON DB1."PUBLIC"."TABLE1"."Id" = DB1."PUBLIC"."TABLE2"."Id" WHERE "queryGroupName" 不在 ('DELETE');

我收到以下错误消息:

SQL 编译错误:位置 3 处的错误第 4 行无效标识符 'DB1.PUBLIC.TABLE1."Id"'

有人知道为什么吗?

【问题讨论】:

    标签: sql snowflake-cloud-data-platform


    【解决方案1】:

    如果目标是将 T1 表上的 JOIN 仅用作过滤器,则可以使用 IN/EXISTS:

    SELECT T2.*
    FROM DB1."PUBLIC"."TABLE2" AS T2 
    WHERE T2."Id" IN (SELECT T1."Id" FROM DB1."PUBLIC"."TABLE1" AS T1)
      AND T2."queryGroupName" NOT IN ('DELETE');
    

    【讨论】:

    • 谢谢。我编辑了你的一些查询,它解决了这个问题。
    • 这是我的答案:SELECT * FROM DB1."PUBLIC"."TABLE2" WHERE DB1."PUBLIC"."TABLE2"."Id" IN (SELECT DB1."PUBLIC"."TABLE1 "."Id" 来自 BW."PUBLIC"."TABLE1" where "queryGroupName" NOT IN ('DELETE'))
    【解决方案2】:

    TABLE1 不在主查询中。它是子查询的一部分。如果为子查询设置别名,则可以通过别名引用它。

    SELECT "TABLE2".*
    FROM (SELECT DISTINCT "Id" FROM DB1."PUBLIC"."TABLE1") T1
    INNER JOIN DB1."PUBLIC"."TABLE2" ON T1."Id" = DB1."PUBLIC"."TABLE2"."Id"
    WHERE "queryGroupName" not in ('DELETE');
    

    【讨论】:

    • 我要补充一点,如果他们也为第二个表添加别名,它会使查询更加清晰。我还要说他们可以删除丑陋的引号,但看起来他们有区分大小写的列名,这意味着它被卡住了..
    • 谢谢格雷格和大卫。我尝试了 Greg 的脚本,它给了我一条错误消息:SQL 编译错误:位置 6 处的错误行 5 无效标识符 '"queryGroupName"'。我相信这是因为我只从 T1 中选择“Id”,而“queryGroupName”来自 T1。如果我在这一行中添加“queryGroupName”: FROM (SELECT DISTINCT "Id","queryGroupName" FROM DB1."PUBLIC"."TABLE1") T1 我得到错误的行数,因为有些行被重复计算了。
    • 是INNER JOIN,所以如果有多个匹配,结果会返回多行。
    猜你喜欢
    • 2015-12-10
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 2010-12-31
    • 2021-06-14
    相关资源
    最近更新 更多