当前位置: 首页 > 知识库问答 >
问题:

SQL:当表B中可能缺少行时,连接表A和表B

欧渝
2023-03-14

我正在尝试在时间戳上连接来自两个表A和B的数据。理想情况下,我希望tableA的每一行都符合unitCode和时间限制,如果tableB中有关联的行,则将其连接,否则假设表B中的颜色已附加,但为空或空。

假设TableA看起来像这样:

id |时间戳|项目1 |项目2 |项目3

表B看起来像这样:

同上|时间戳|项目 B1 |项目 B2

因此,数据可能如下所示:

  • 时间戳|itemA1|itemA2|itemA3|itemB1|itemB2
  • [日期时间]|10|11|40|26|12
  • [日期时间]|10|11|40|26|12
  • [日期时间]|10|11|40|null|null
  • [日期时间]|10|11|40|26|12
  • [日期时间]|10|11|40|null|null

目前我正在使用这个:

SELECT * FROM tableA AS a 
JOIN (SELECT * FROM tableB) AS b
ON (a.timestamp = b.timestamp)
WHERE b.unitCode = 'CODE' AND b.timestamp BETWEEN 'STARTDATETIME' AND 'ENDDATETIME' ORDER BY b.timestamp DESC`

但是它只在给定的tableA有对应的tableB的实例中生成行。

共有1个答案

吴松
2023-03-14

使用< code >左连接。< code>LEFT JOIN获取条件语句左侧的所有记录,以及它在右侧应用的所有记录。但是,您需要小心使用< code>WHERE子句,因为如果它对您的右表(在您的情况下是表' b ')有值限制,那么它仍然会排除那些行。

SELECT * FROM tableA AS a 
LEFT JOIN (SELECT * FROM tableB) AS b
ON (a.timestamp = b.timestamp)
WHERE b.unitCode = 'CODE' AND b.timestamp BETWEEN 'STARTDATETIME' AND 'ENDDATETIME' ORDER BY b.timestamp DESC`

LEFT JOIN引用:https://dev.mysql.com/doc/refman/5.7/en/left-join-optimization.html

正如@Ike所指出的,您的查询可以更正为:

SELECT * 
FROM tableA AS a 
LEFT JOIN tableB AS b
    ON a.timestamp = b.timestamp
    AND b.unitCode = 'CODE' 
    AND b.timestamp BETWEEN 'STARTDATETIME' AND 'ENDDATETIME'
ORDER BY b.timestamp DESC`

正如我前面提到的,如果条件在< code>WHERE子句中,它将排除< code>LEFT JOIN的概念,因此所有具有< code>NULL值的行(因为它不符合表b的标准)都将被排除。

为了解决您的意见,如果您添加了 WHERE 子句,我建议(根据我对您的目标的理解)仅让条件影响表 A,并将 tableB 的所有条件都放在左联接中。

SELECT * 
FROM tableA AS a 
LEFT JOIN tableB AS b
    ON a.timestamp = b.timestamp
    AND b.unitCode = 'CODE' 
    AND b.timestamp BETWEEN 'STARTDATETIME' AND 'ENDDATETIME'
WHERE
    a.timestamp BETWEEN 'STARTDATETIME' AND 'ENDDATETIME'
ORDER BY b.timestamp DESC`

现在,如果a.timestamp条件是您要查找的,那么LEFT JOIN中tableB的条件是多余的,因为我们已经知道tableB中的时间戳必须与tableA中的相应时间戳匹配。

 类似资料:
  • 我最近开始尝试kafka流。我有一个场景,我需要用加入。可能是因为不包含某些键。在这种情况下,我会得到一个。 具体来说,我得到了 StreamThread-1在处理过程中流应用程序错误:java.lang.NullPointerException 我不知道我该如何处理这个问题。我无法以某种方式过滤掉与表条目不对应的流记录。 使现代化 进一步查看,我发现我可以通过 接口查询基础存储以查找是否存在密钥

  • 问题内容: ** 我定义了以下类和接口: 我有一个的对象,我需要投给的对象: 上面的最后一行导致编译错误“无法从List 强制转换为List ”。我尝试通过以下方法解决此问题: 不幸的是,这引发了。有谁知道我该如何解决? ** 问题答案: ** 您不能像那样抛弃它。创建一个新的: 构造函数采用。无论如何,它将指向相同的引用。 **

  • 我编写了这个函数,它看起来很有用,但我想知道是否有更干净的解决方案。 奖励问题:我有一个java 8约束,但是后来的版本如何改进它?我想我不再需要使用 ,因为 Java 9 引入了 函数。

  • 问题内容: 我剩下两个表,“设备”和“单元”。设备定义设备的类型,单元是唯一的设备,它指向设备表中的一行,并定义其类型。 我现在正在寻找一种解决方案,以从“设备”中选择每种设备类型,并计算指向该设备的设备数量。我目前的解决方案面临的问题是 SQL : Scala Slick : 即使没有单位指向设备类型,我也得到至少1的计数结果。 如何在SQL中或最好在Slick中实现此计数? 问题答案: 您的S

  • 问题内容: 整个晚上 其实是晚上。大约晚上11点。我的大脑正在关闭,需要一些帮助,所以我可以完成工作并回家:) 我有两个表-表a和表b。当其他两个字段匹配时,我需要使用表b中的值更新表a中的字段。这些表的每个记录没有唯一的ID :( 基本上,我想这样做: 或者至少…我认为那是我想要做的… 有人可以帮我吗? 问题答案: 您可以通过更新中的联接来执行此操作:

  • 问题内容: 我有两个表:产品和订单。订单通过ProductID引用产品作为外键。我想知道每种产品已售出多少次,包括仅售出一次的产品。我几乎可以使用左联接来使其工作,但是对于所有产品,无论它们是否存在于orders表中,它仍然会为每一行提供一个计数为1的行。 有没有一种方法可以使您最终得到这样的结果? … 等等。 问题答案: 如果您只执行a ,那么您会将没有订单的产品计为1 … ,这将只计算具有非n