【问题标题】:How to join two Tables which have no unique ID如何连接两个没有唯一 ID 的表
【发布时间】:2017-06-20 11:30:49
【问题描述】:

我正在尝试将表 1 左连接到表 2

Table1          Table2  
ID  Data        ID  Data2
1   r           1   q
2   t           1   a
3   z           2   x
1   u           3   c

在我离开加入这两个表之后,我想得到这样的东西

  Table1+2      
ID  Data    Data2
1   r        a
2   t        x
3   z        c
1   u        q

而不是

  Table1+2      
ID  Data    Data2
1   r        q
2   t        x
3   z        c
1   u        q

我的问题是:是否有可能告诉表 2,如果您在表 1 中使用了某些东西,请不要使用它并给我下一个值。我是否必须将其设为 T-SQL 或 to 和新列,如果此 id 存在,我可以在其中列出,如果不存在则写入 2(数字数据)。我怎么解决这个问题? 你提前。

【问题讨论】:

  • 您在下面有几个答案可能会给您想要的答案/行为,但最好的长期解决方案可能是修复您的架构,以便可以轻松地以您想要的方式加入。跨度>

标签: sql-server tsql join unique


【解决方案1】:

由于两个表上的 ID 都没有唯一性,让我们为其添加一些唯一性。
所以它可以用来加入。
可以使用窗口函数ROW_NUMBER

给出预期结果的示例解决方案:

DECLARE @TestTable1 TABLE (ID INT, Data VARCHAR(1));
DECLARE @TestTable2 TABLE (ID INT, Data VARCHAR(1));

INSERT INTO @TestTable1 VALUES (1,'r'),(2,'t'),(3,'z'),(1,'u');         
INSERT INTO @TestTable2 VALUES (1,'q'),(1,'a'),(2,'x'),(3,'c');

select 
 t1.ID, t1.Data,
 t2.Data as Data2
from (
  select ID, Data, 
  row_number() over (partition by ID order by Data) as rn
  from @TestTable1
) t1
left join (
  select ID, Data, 
  row_number() over (partition by ID order by Data) as rn
  from @TestTable2
) t2 on t1.ID = t2.ID and t1.rn = t2.rn;

注意:由于 LEFT JOIN,这确实假设 table2 中相同 ID 的数量与 table1 上的相同或更少。但如果不是这种情况,您可以将其更改为 FULL JOIN。

返回:

ID  Data Data2
1   r    a
1   u    q
2   t    x
3   z    c

获得其他结果可以通过不同的方式实现。
这其实是比较常见的情况。
一个人想要表 1 中的所有内容,但对于表 1 的每条记录只能从表 2 中获取一个值。

1) top 1 with tiesorder by rownumber() 的组合

select top 1 with ties 
 t1.ID, t1.Data,
 t2.Data as Data2
from @TestTable1 t1
left join @TestTable2 t2 on t1.ID = t2.ID
order by row_number() over (partition by t1.ID, t1.Data order by t2.Data desc);

top 1 with ties 只会显示row_number() = 1 的那些

2) 在子查询中使用 row_number:

select ID, Data, Data2
from (
    select 
     t1.ID, t1.Data,
     t2.Data as Data2,
     row_number() over (partition by t1.ID, t1.Data order by t2.Data desc) as rn
    from @TestTable1 t1
    left join @TestTable2 t2 on t1.ID = t2.ID
) q
where rn = 1;

3) 只是一个简单的分组和一个最大值:

select t1.ID, t1.Data, max(t2.Data) as Data2
from @TestTable1 t1
left join @TestTable2 t2 on t1.ID = t2.ID
group by t1.ID, t1.Data
order by 1,2;

所有 3 个都给出相同的结果:

ID Data Data2
1  r    q
1  u    q
2  t    x
3  z    c

【讨论】:

    【解决方案2】:

    使用ROW_NUMBER

    DECLARE @Table1 TABLE (ID INT, DATA VARCHAR(10))
    DECLARE @Table2 TABLE (ID INT, DATA VARCHAR(10))
    
    INSERT INTO @Table1
    VALUES
    (1,   'r'),        
    (2,   't'),        
    (3,   'z'),        
    (1,   'u')         
    
    INSERT INTO @Table2
    VALUES
    (1,   'q'),
    (1,   'a'),
    (2,   'x'),
    (3,   'c')   
    
    SELECT
        A.*,
        B.DATA
    FROM
        (SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY(SELECT NULL)) RowId FROM @Table1) A INNER JOIN 
        (SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY(SELECT NULL)) RowId FROM @Table2) B ON A.ID = B.ID AND
                                                                                                      A.RowId = B.RowId
    

    【讨论】:

      猜你喜欢
      • 2019-06-24
      • 2014-09-30
      • 2014-08-04
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多