在没有唯一键的两个表上选择查询

Posted

技术标签:

【中文标题】在没有唯一键的两个表上选择查询【英文标题】:select query on two tables with no unique keys 【发布时间】:2011-02-09 12:44:50 【问题描述】:

我有两张桌子。

表1


col1 col2 col3
100 一个 1000
100 一个 1000
100 1002
100 乙 1003
100 C 1004

表2


col1 col2 colC
100 A 1X
100 A 2X
100 A 3X
100 B 4X
100℃ 5X

上表中colC的值是唯一的。

我希望我的输出是这样的,其中 colC 值在这里也是唯一的。


col1 col2 col3 colC
100 A 1000 1X
100 A 1000 2X
100 A 1002 3X
100 B 1003 4X
100 C 1004 5X

我必须使用 col1 和 col2 作为连接的键。

这样可以吗。当我尝试使用内连接和左外连接时,前两条记录出现重复。 TIA

【问题讨论】:

鉴于 1X 和 2X 的唯一性 - 选择 col3 = 1000 而不是 1003 的业务规则是什么?反之亦然 3X 你的例子没有意义。当 col1 和 col2 分别为 100 和 A 时,它与表 1 中的 1000、1000 和 1002 相关联。在表 2 中,它与 1X、2X 和 3X 相关联。即使考虑到您的唯一性要求,您也会得到与所有三个 colC 相关联的 1000 和与所有三个 colC 相关联的 1002。所以至少 100 行 6 行。 @Mark - 根据我的要求,当 t1.col1=t2.col1 和 t1.col2=t2.col2 超过一行时,colC 可能会变得混乱并分配给任何一条记录在输出中。 【参考方案1】:

这样的?

select
  a.col1,
  a.col2,
  a.col3,
  b.colC 
from (
  select
    row_number() over (partition by col1, col2 order by 1) r,
    col1,
    col2
  from 
   table1
  ) a,  (
  select
    row_number() over (partition by col1, col2 order by 1) r,
    col1,
    col2
  from 
   table2
  ) b
  where a.r = b.r and
        a.col1 = b.col1 and
        a.col2 = b.col2;

【讨论】:

是的,和我想的差不多。只有某些列名不正确,否则为 +1。【参考方案2】:
SELECT t1.col1, t1.col2, t1.col3, t2.colC FROM Table1 t1
JOIN Table2 t2
ON t1.col1 = t2.col1
AND t1.col2 = t2.col2

这不对吗?

编辑:您说您得到了重复项,但这会发生,因为您指定为键的 2 列实际上不是键。还有其他行具有相同的值。因此,如果该组合是唯一的,则可能是数据有问题,或者您的需求需要重新考虑。

【讨论】:

以上是关于在没有唯一键的两个表上选择查询的主要内容,如果未能解决你的问题,请参考以下文章

在 MYSQL 表上选择查询需要很长时间并超时

在子表上选择查询

SQL Server - 在视图上选择列的内部查询是啥

在正则表达式上选择一行没有重复条目

MYSQL 在一列上选择两个值

在单击反应表上选择行