左外连接还是 where 语句?

Posted

技术标签:

【中文标题】左外连接还是 where 语句?【英文标题】:Left outer join or where statement? 【发布时间】:2015-07-29 20:48:55 【问题描述】:

我有一个查询,它给出了同一日期四个不同表中的记录总数。我将它们过滤为五个相关项目并排除一种类型。

SELECT
COUNT (*) AS table_total_filtered
FROM
db.table_1_20150727,
db.table_2_20150727,
db.table_3_20150727,
db.table_4_20150727
WHERE
item LIKE "A" OR item LIKE "B" OR item LIKE "C"
OR item LIKE "D" OR item LIKE "E" AND
type NOT LIKE "Z"    

我有第二个查询,它给了我第二个表中的行数。数据可能存在时区差异,因此我将表格拉出三天,目标日期为中间日期。

SELECT
COUNT (*) AS table_2_total
FROM
db2.table_20150726,
db2.table__20150727,
db2.table__20150728

这两个表有一个共同的字段。公共字段在每个表中具有不同的名称。该字段在 table_1、table_2、table_3 和 table_4 中称为 ID1。在表中称为 ID2。我想获取第二个查询的结果,然后计算两个 ID 匹配的次数。

SELECT
COUNT (*) AS overlap
FROM
db.table_1_20150727,
db.table_2_20150727,
db.table_3_20150727,
db.table_4_20150727,
db2.table_20150726,
db2.table__20150727,
db2.table__20150728
WHERE
item LIKE "A" OR item LIKE "B" OR item LIKE "C"
OR item LIKE "D" OR item LIKE "E" AND
type NOT LIKE "Z" AND
ID1 = ID2

据我了解,此查询不起作用,因为第一步计算第一个表的计数,并试图计算不存在的 ID2。使用表名限定字段似乎也不起作用,因为文本不会变成蓝色。我相信此时排位赛不是我的问题,我需要做的是将第一个查询的结果与第二个查询的结果进行左连接,然后计算 ID1=ID2 的位置?

非常感谢任何有关如何编写/处理适当语句以连接这两个查询并计算 ID1 与 ID2 匹配的记录数的帮助!

谢谢!

【问题讨论】:

【参考方案1】:

听起来您想要一个非常简单的JOIN,并将您的每个初始查询作为来源:

SELECT
  COUNT(*) as overlap
FROM (
  SELECT
    ID1
  FROM
    db.table_1_20150727,
    db.table_2_20150727,
    db.table_3_20150727,
    db.table_4_20150727
  WHERE
    item LIKE "A" OR item LIKE "B" OR item LIKE "C"
    OR item LIKE "D" OR item LIKE "E" AND
    type NOT LIKE "Z") AS table_1
JOIN (
  SELECT
    ID2
  FROM
    db2.table_20150726,
    db2.table__20150727,
    db2.table__20150728) as table_2
ON table_1.ID1 = table_2.ID2

请注意,在许多 SQL 系统中,逗号表示JOIN,但in BigQuery, the comma actually represents a union:

注意:与许多其他基于 SQL 的系统不同,BigQuery 使用逗号语法来表示表联合,而不是联合。

这可能就是您在上面发布的查询没有达到您预期的原因。

【讨论】:

谢谢丹尼。我得到资源超出错误。加入每个它返回不可能的#。我没有清楚地解释我的目标。查询中返回的值 > table_1 的总数。 table_2 是 table_1 的子集。当为 WHERE 语句中的项目过滤 table_1 时,Table_2 不包括识别重叠所需的字段。因此,为什么我要过滤 table_1,然后尝试将 table_2 加入较小的 table_1。我想要发生的是 A) table_1 过滤到 WHERE 中的标准。 B)table_2 与 A 的结果连接。C)计数总计,其中 ID1=ID2。 table_2 的间接过滤器。再次感谢! 两个表中是否有可能存在重复的 id?如果是这样,那可能会夸大返回的计数,因为 table_1 中的 2 行可能匹配 table_2 中的 2 行,导致特定 id 的计数为 4。您可以在子选择中使用GROUP BY ID1GROUP BY ID2(或GROUP EACH BY,如有必要)以确保没有重复项。另一种选择可能是将*** COUNT 更改为 EXACT_COUNT_DISTINCT(table_2.ID2),这只会计算唯一 ID。

以上是关于左外连接还是 where 语句?的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL同表左外连接多表

左外连接和空值转换

Laravel 查询构建器与 where 左外连接

左外连接导轨在 where 条件下具有急切加载

SQL 左外连接后还能加where不

具有许多表、左外连接和 where 子句的 LINQ 查询