左表和右表中连接列的连接条件

问题描述 投票:0回答:1

假设 Nick 设计得很糟糕,由两个表“A”和“B”组成的数据库。

表“A”中有 3 列可用:

列名称 数据类型
自然键 字符串
部门 字符串
员工姓名 字符串

表“A”中的列“natural_key”是从抽象源存储的,但我们知道它是“employee_id”和“department”的串联。

表A中的示例数据:

自然键 员工姓名 部门
5001营销 约翰 营销
6789销售额 玛丽 销售

表“B”中只有一列可用:

列名称 数据类型
员工_id 字符串

表B中的示例数据:

员工_id
6789
8001

Nick 希望对这两个表执行 INNER JOIN。但由于他没有任何匹配的列,因此他编写了以下查询:

SELECT 
  B.employee_id,
  A.employee_name
FROM A
INNER JOIN B
ON A.natural_key = CONCAT(B.employee_id, A.department);

问题:

  1. 上面的连接条件有什么问题吗?抛开数据库设计不好不谈,连接不允许连接优化,两个employee_id可能属于同一个部门,导致数据不正确?

  2. 连接是否会导致交叉连接,即首先将表 B 的每一行连接到表 A 的所有行,然后执行连接?

sql mysql google-bigquery
1个回答
0
投票

以下是如何使用

regex

WITH A AS (
    SELECT '5001Marketing' AS natural_key, 'John' AS employee_name, 'Marketing' AS department
    UNION ALL
    SELECT '6789Sales', 'Mary', 'Sales'
),
B AS (
    SELECT '6789' AS employee_id
    UNION ALL
    SELECT '8001'
)
SELECT 
    B.employee_id,
    A.employee_name
FROM A
INNER JOIN B
ON B.employee_id = REGEXP_SUBSTR(A.natural_key, '^[0-9]+')

© www.soinside.com 2019 - 2024. All rights reserved.