假设 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);
问题:
上面的连接条件有什么问题吗?抛开数据库设计不好不谈,连接不允许连接优化,两个employee_id可能属于同一个部门,导致数据不正确?
连接是否会导致交叉连接,即首先将表 B 的每一行连接到表 A 的所有行,然后执行连接?
以下是如何使用
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]+')