一个数据库小问题,却险些酿成大祸

76 阅读3分钟

之前写了一段报表查询的自助查询sql,领导每月汇报数据都在用,今天突然问我这个数据跟另一张表里的数据怎么对不上呀,按照我的查询会比原始查询多1300多条!妈妈呀!这可是领导每每向上汇报的数据,可能会对部门的规划和安排有影响!于是马上仔细查看,搞了2个多小时,才发现是join的问题。

于是看了join的相关知识点,整理如下: 数据库中的连接(Join)是一种机制,用于查询两个或多个表中的数据,基于这些表之间的关系。以下是常见类型的连接:

  1. 内连接 (INNER JOIN)

    • 返回两个表中有匹配的记录。
    • 如果某行在一个表中有匹配而在另一个表中没有,则该行不会出现在结果集中。
  2. 左外连接 (LEFT OUTER JOIN)

    • 返回左表中的所有记录,即使右表中没有匹配。
    • 如果左表中的行在右表中没有找到匹配,则这些行将与右表中的“空”(NULL)值一起返回。
  3. 右外连接 (RIGHT OUTER JOIN)

    • 返回右表中的所有记录,即使左表中没有匹配。
    • 如果右表中的行在左表中没有找到匹配,则这些行将与左表中的“空”(NULL)值一起返回。
  4. 全外连接 (FULL OUTER JOIN)

    • 返回左表和右表中的行,无论它们是否有匹配。
    • 如果某个表中的行在另一个表中没有匹配,那么该行仍会出现在结果集中,并与另一个表中的“空”(NULL)值组合。
  5. 交叉连接 (CROSS JOIN)

    • 也被称为笛卡尔乘积。
    • 返回第一个表中的每一行与第二个表中每一行的组合。
    • 如果两个表分别有N行和M行,那么结果集将有N×M行。
  6. 自然连接 (NATURAL JOIN)

    • 基于两个表中具有相同名称的所有列自动执行连接。
    • 只返回那些在两个表中都有匹配值的列。
  7. 条件连接

    • 使用特定的ON子句或者USING子句来指明连接条件。
  8. 自连接 (SELF JOIN)

    • 不是一种独立的连接类型,而是任何上述类型的连接应用于同一个表。

不同的数据库系统可能支持不同的连接语法和类型。这些连接类型通常通过SQL(结构化查询语言)进行实现。

原因

我查询的时候使用的left join,导致了同名服务,不同分组之间数据的冗余

解决

讲left join换成inner join,只匹配相应的数据,查询的数据与另一张表基本吻合

提示

整体是一个小的运维问题,但是有可能造成大的影响,引以为戒吧。也从侧面提醒了我数据库知识的匮乏,技术之路如漫漫长夜,慢慢摸索吧。