我有2个表 - 一个主表和另一个表。两者都没有任何钥匙。表格的结构如下。
first name last name role location Compensation Level state
john smith Manager LA A CA
john smith Manager BOS B MA
super smither developer LA B CA
tina taylor supervisor SFO A CA
tina taylor supervisor BOS B MA
first name last name role dept
john smith manager finance
john smith manager hr
super smither developer PA
tina taylor supervisor HR
tina taylor supervisor hr
非常可以理解的是,加入两个表以获得名字,姓氏和角色组合的部门将导致不正确的结果,因为混合中涉及的其他字段标识了真正的唯一记录。
但鉴于这样的结构,有什么方法可以加入这两个表来获得部门吗?
由于最终过程的设计方式以及其他因素,使用内联子查询不是一种选择。
有什么想法吗?
预期产量:
first name last name role location Compensation state dept
john smith Manager LA A CA finance
john smith Manager BOS B MA hr
super smither developer LA B CA PA
tina taylor supervisor SFO A CA HR
tina taylor supervisor BOS B MA HR
这是一个给出确定性结果的例子,但它们是任意结果。它只是基于确定每个表中的“有序位置”,以便可以进行选择,并且每次执行查询时该选择都是相同的,但是无法知道选择是否正确。
WITH
sorted_t1 AS
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY first_name, last_name, role
ORDER BY compensation_level, location, state) AS discriminator
FROM
t1
)
,
sorted_t2 AS
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY first_name, last_name, role
ORDER BY dept) AS discriminator
FROM
t2
)
SELECT
*
FROM
sorted_t1 t1
FULL OUTER JOIN
sorted_t2 t2
ON t1.first_name = t2.first_name
AND t1.last_name = t2.last_name
AND t1.role = t2.role
AND t1.discriminator = t2.discriminator
笔记:
这假定为“不区分大小写”的归类序列。否则john smith
行将永远不会加入(因为'Manager'
不匹配'manager'
)
类似地,表2中的两个tina taylor
行是不同的('hr'
vs 'HR'
),但是如果归类序列不区分大小写,那么哪个连接到哪个并不重要,因为行之间没有“材料”差异。
同样值得注意的是,在上面的例子中没有真正的理由假设来自洛杉矶的'John Smith'
在finance
。查询只是强制关联,因为或者在ORDER BY
中选择了ROW_NUMBER()
。这意味着当使用这种技术时,你真的应该使用其他领域,一个意味着彼此相关的东西。