【问题标题】:sql server join tables without primary key using common columnssql server 使用公共列连接没有主键的表
【发布时间】:2018-10-20 06:12:18
【问题描述】:

我有两张桌子

     Id   Name   Units sold
     1    n1,       100 
     2    n2,       95 
     3    n3,       84 
     4    n3,       84 
     5    n5,       100 



  Name   Units sold  Excess Units  Table1_Id
     n1,       100      51            9
     n2,       95       43            10
     n3,       84       100           11
     n3,       84       33            12
     n5,       100      10            13

我无法加入这两个表,因为Table1_Id 实际上是加载这两个表的临时表的Id
每次加载后该表都会被清除。

我想在第一个表格中显示多余的单位。

到目前为止,我的方法是

select table1.*, table2.Excess_units from Table1 inner join
Table2 on Table1.Name = Table2.Name and Table1.Units_sold = Table2.Units_Sold

但是我担心我可能会遇到这样的情况 2个Table2记录,不知道哪个对应Table1

例如:

在选择n3 记录时,如何将Table1first and second n3 记录与Table2first and second n3 记录关联?

【问题讨论】:

  • 这将有助于了解有关数据的更多信息。例如,为什么n3 会有两个不同的超额单位值?如果这是有效的,是否是每个位置,例如,仓库 A 中有 33 个多余的单元,但仓库 B 中有 100 个多余的单元?要么你需要更多的数据持久化(或正确的数据——来自源表的实际 id),要么你需要关于诸如求和之类的东西是否有效的要求——按名称总计产品的多余单位,但不知道个人价值观的起源。
  • 未来我们会得到更多的持久化值,现在是关于表中已经存在的数据。列名和值都是为了显示潜在问题而编造的。我想基于公共列加入,并希望将table1 记录与table2 中的正确对应项相关联
  • 为什么不将Table1_Id 列添加到您的第一个表中,然后您只需要使用Table1_Id 加入您的两个表吗?您当前的方法仅基于直觉,没有提供任何逻辑来确保获得正确的结果。
  • 我不知道该把哪个Ids 放在该列中。这就是我尝试加入查询的原因。 Table1 有 100000 行,table2 有 11000000 行。

标签: sql sql-server inner-join distinct primary-key


【解决方案1】:

使用row_number() 生成加入的序号

select *
from
(
    select *, rn = row_number() over(partition by name, units_sold order by name)
    from   Table1
) t1
inner join
(
    select *, rn = row_number() over(partition by name, units_sold order by name)
    from   Table2
) t2
on  t1.name = t2.name and t1.units_sold = t2.units_sold and t1.rn = t2.rn

【讨论】:

  • 在窗口函数的partition byorder by 子句中具有相同的列或表达式几乎总是错误的。在这里,我们知道每个分区中的所有行都将具有相同的name。因此,分配的行号是不确定的。
猜你喜欢
  • 2019-09-25
  • 1970-01-01
  • 2021-09-20
  • 2015-11-11
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 1970-01-01
相关资源
最近更新 更多