Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 连接没有键的表会导致不正确的结果_Sql_Sql Server - Fatal编程技术网

Sql 连接没有键的表会导致不正确的结果

Sql 连接没有键的表会导致不正确的结果,sql,sql-server,Sql,Sql Server,我有两个表-一个是主表,另一个是查找表。两个人都没有钥匙。各表的结构如下 first name last name role location Compensation Level state john smith Manager LA A CA john smith Manager BOS B

我有两个表-一个是主表,另一个是查找表。两个人都没有钥匙。各表的结构如下

     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      
可以理解的是,合并两个表以获取部门的名字、姓氏和角色组合将导致不正确的结果,因为混合中还涉及其他字段来标识真正的唯一记录

但是考虑到这样的结构,有没有办法将这两个表连接起来以获得dept

由于最终过程的设计方式和其他因素,使用内联子查询不是一个选项

有什么想法吗

预期产出:

 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'
),但是如果排序规则序列不区分大小写,那么哪一行连接到哪一行并不重要,因为行之间没有“重大”差异


还值得注意的是,在上面的示例中,没有真正的理由假设来自LA的
'John Smith'
财务中。查询只是强制该关联,因为在
行编号()
中选择了
排序依据。这意味着,当使用这种技术时,你真的应该使用其他字段,其中一个表示彼此相关的东西。

没有任何键,你到底打算怎么做?没有办法分辨哪个约翰·史密斯在哪。tina taylor也一样。完全不是。这不是钥匙本身的问题,而是无法唯一识别角色/部门。表2需要的鉴别器也在表中1@DanGuzman我不知道,这是目前设计面临的挑战。除非重新设计结构,否则无法判断我是否为员工分配了正确的部门。这是一个设计问题。你需要解决这个问题。否则就没有解决方案解雇你的开发团队。从大炮里出来。