使用来自多个数据集 SQL 的多个 LEFT JOIN

Posted

技术标签:

【中文标题】使用来自多个数据集 SQL 的多个 LEFT JOIN【英文标题】:use multiple LEFT JOINs from multiple datasets SQL 【发布时间】:2020-06-25 20:30:46 【问题描述】:

我需要执行多个 JOIN,我正在从多个表中获取数据并在 id 上进行 JOIN。棘手的部分是一张桌子我需要加入两次。代码如下:

(
    SELECT
        content.brand_identifier AS brand_name,
        CAST(timestamp(furniture.date) AS DATE) AS order_date,
total_hearst_commission
    FROM
        `furniture_table` AS furniture
        LEFT JOIN `content_table` AS content ON furniture.site_content_id = content.site_content_id
    WHERE
        (
            timestamp(furniture.date) >= TIMESTAMP('2020-06-01 00:00:00')
        )
)
UNION
(
    SELECT
        flowers.a_merchant_name AS merchant_name
    FROM
        `flowers_table` AS flowers
        LEFT JOIN `content` AS content ON flowers.site_content_id = content.site_content_id
)
GROUP BY
    1,
    2,
    3,
    4
ORDER BY
    4 DESC
LIMIT
    500

我以为我可以使用 UNION,但它给了我一个错误 Syntax error: Expected keyword ALL or keyword DISTINCT but got "("

【问题讨论】:

此查询有多个错误。首先,两个子查询返回的列数不同。样本数据和期望的结果将有助于阐明您想要什么。 SELECT ... UNION SELECT ... 即跳过那些括号。 让它变得简单,并有可能为您提供帮助:minimal reproducible example 这是最小的可重现示例。我不知道还有什么方法可以最小化它。整个代码是我需要解决的,这就是我在这里发布的原因。 虽然语法不正确,group by 的预期用途是什么?按所有列分组是没有意义的。无论如何,第一个结果只有三列(少于 4 列)。 【参考方案1】:

我无法发表评论,但与 GHB 状态一样,查询的列数不同;因此,UNION 在这里不起作用。

我认为首先了解为什么需要子查询会很有帮助。我猜这个查询不会产生你想要的结果,所以请详细说明为什么会这样。

    select 
        f.a_merchant_name as merchant_name,
        c.brand_identifier as brand_name, 
        CAST(timestamp(f.date) AS DATE) AS order_date,
        total_hearst_commission
    from furniture_table f
    left join content_table c on c.site_content_id = f.site_content_id
    where timestamp(f.date) >= TIMESTAMP('2020-06-01 00:00:00')
    group by 1,2,3,4

【讨论】:

以上是关于使用来自多个数据集 SQL 的多个 LEFT JOIN的主要内容,如果未能解决你的问题,请参考以下文章

多个左连接 - 啥是“左”表?

BigQuery:使用标准 SQL 查询多个数据集和表

使用 #eval() 将来自单个数据集的多个表中的数据绑定到转发器

多个 GROUP 和 COUNT Oracle SQL

pandas读取多个excel文件并拼接(append)起来形成最终的dataframe与标签文件连接(join)形成最终学习数据集

SSRS:来自多个数据库的联合数据