【问题标题】:With SQL, how do I deal with JOINing databases with a lot of columns that all need to be unique?使用 SQL,我如何处理包含许多列的 JOINing 数据库,这些列都必须是唯一的?
【发布时间】:2023-01-30 00:28:50
【问题描述】:

好的,这是我第一次使用大型数据库,这非常可怕。 这是我想要发生的一个例子:

table 1
ID   art1  art2
1    90    20
2    20    80
3    20    20

table 2
ID   art1  art2
1    20    20
2    40    30
4    20    50

期望的结果(顺序无关紧要)

table 1
ID   art1  art2
1    ...
2
3
4

我有点小规模地得到它,我为此使用 LEFT JOIN,并且从我读到的内容来看,GROUP BY 至少用于属性(如果不是 ID?)。

我的问题是这些表很大。有 30 列或更多列和大约 25k 行。

那么我应该写 30 多个 GROUP BY 吗?有没有更有效的东西?喜欢 GROUP ALL?

这些表还有一个奇怪的地方。它们有大量 Null 行(在某些列中具有 attr 1),并且它们的 ID 均为 0。但是它们必须留在那里,因为出于功能原因,表必须正好有 26001 行。因此,在我完成后,我必须删除与添加的行一样多的行,但我不能在 SQL 之外这样做,而且这对我来说更快。

我的想法是否正确?到目前为止,在我发现 GROUP BY 之前,我只尝试了一个查询。我等了大约 50 万行 5 分钟,所以这并不好。我的查询是:

SELECT *
FROM `table1` 
LEFT JOIN `table2`
USING (ID)

现在我想应该是

SELECT *
FROM `table1` 
LEFT JOIN `table2`
USING (ID)
GROUP BY *insert all columns?*

但我不确定,我是否还必须“排列”所有列以避免重复结果?还是我必须使用 DISTINCT?再次在所有 30 多个列上?

【问题讨论】:

    标签: sql join google-bigquery large-files


    【解决方案1】:

    通过...分组用于将某些列中具有相同值的行组合在一起,然后聚合其他列中的值。在您的情况下,听起来您想包括两个表中的所有行,因此无需使用 GROUP BY。

    而不是选择所有列“SELECT *”,你应该在查询中指定你实际需要的列。这也将有助于提高性能。

    DISTINCT 用于从结果集中删除重复项。如果您得到重复的结果,可能是因为 ID 列中的重复值。您可以使用 DISTINCT 删除这些重复项。

    SELECT *
    FROM `table1` 
    LEFT JOIN `table2`
    ON table1.ID = table2.ID
    WHERE table1.ID != 0
    

    where 将从两个表中排除 ID = 0 的行。

    另外值得注意的是,可以通过在两个表的 ID 列上创建索引来提高查询的性能。

    希望能帮助到你

    【讨论】:

    • 谢谢回复。我用你的方法没有成功。我只从第一个表中获得所有结果,而从另一个表中没有。我需要第一个的所有结果和第二个的“不匹配”。我应该提到这些表具有完全相同的标题和列。在我的小规模测试中,我使用 UNION 取得了成功。这是一个好的解决方案吗?我唯一的问题是,我不确定它使用哪一列来识别唯一性,因为我的表中只应考虑一列。但是我的一些辅助测试行已经有重复项并且仍然被返回(这很好)
    【解决方案2】:

    考虑到其他 cmets 和答案,我的建议是:

    1. 谨慎使用SELECT *,通常它会查询所有内容,包括您不需要的内容。由于 BigQuery 是共存的,它会像增加列数一样增加查询的费用。在这里考虑你的情况。
    2. 如果你想再试一次join,考虑在你的情况下使用inner join,因为它会过滤掉你不想要的东西,而且它比最后的where子句表现更好,考虑到大数据场景,这是一场胜利。
    3. UNION 可能是一个很好的解决方案,即使您已经测试过。为了解决您对数据重复性的担忧:BigQuery 将考虑所有列。因此,如果您的 ID 重复但数据不同,您将必须指定哪个是正确的。为此,请考虑:
      1. 使用 window function 使用 row_number() function 进行行计数。窗口函数在大数据场景下表现优于group by ones。
      2. 确保添加所有条件以识别窗口的partition by 上的唯一性。此外,执行此操作的一个好方法是按 DESC 排序,因此第一条记录就是您想要的记录。
      3. 完成后,您可以使用 0 过滤它们。行号等于 0 的每条记录都是唯一的,并且是您想要的记录。

        窗口函数在大数据场景中非常有用,here 有一篇精彩的文章可以更好地理解这一点。

    【讨论】:

      猜你喜欢
      • 2019-03-01
      • 2017-05-19
      • 2018-05-22
      • 2020-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      相关资源
      最近更新 更多