无键连接表会导致错误的结果

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

我有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
sql sql-server
1个回答
1
投票

这是一个给出确定性结果的例子,但它们是任意结果。它只是基于确定每个表中的“有序位置”,以便可以进行选择,并且每次执行查询时该选择都是相同的,但是无法知道选择是否正确。

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()。这意味着当使用这种技术时,你真的应该使用其他领域,一个意味着彼此相关的东西。

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