【问题标题】:Join tables based on set of values in distinctive columns in any order基于不同列中的一组值以任意顺序连接表
【发布时间】:2019-07-15 10:21:36
【问题描述】:

我在工作中遇到了一个问题,我对 SQL 或一般的数据库了解太少,甚至不知道如何搜索。

因此,在 StackOverflow 问题上获得无数“观点”之后,这是我自己的第一个。

我有两个表,它们之间没有其他关系,除了同一组列(我称它们为 item_1 到 item_3),其中的值以随机顺序排列。 我需要加入这些表,但我不能只在每一列上加入它们,因为我正在寻找相同的set以任何顺序。 两个表中的集合需要相同(没有更多,也没有更少),但位置无关紧要。

这里有一些假表来(希望)解释我的意思:

表1

user_id | use_name | item_1 | item_2 | item_3
--------+----------+--------+--------+--------
 1      | Tim      | A      | B      | NULL
 2      | Tom      | NULL   | NULL   | C
 3      | Sam      | A      | NULL   | NULL

表2

role     | item_1 | item_2 | item_3
---------+--------+--------+--------
type1    | A      | NULL   | B
type2    | A      | B      | C
type3    | A      | NULL   | NULL

我正在寻找一个可以生成如下表格的选择/连接:

user_name | role
----------+------
Tim       | type1
Sam       | type3

我用排列表试试运气,但在实际情况下,我们讨论的不是 3 列而是 10 列,这似乎不是最佳解决方案。 我目前正在尝试使用 pivot / unpivot 实现一些有用的东西,但到目前为止没有任何结果。

我什至会很高兴只有一篇文章的链接。甚至是我的问题的独特名称,我可以用谷歌搜索:)

非常感谢!

【问题讨论】:

  • 结果集的逻辑是什么?
  • Sam 只有项目 A -> 以及角色 type_3。 Tim hast item A 和 B -> 以及角色 type_1
  • 我真的不确定,我能想到的就是以某种方式获取列中的值,然后按字母顺序排列它们,然后加入。对,是的。这是一种方法,按字母顺序使用“项目代码”创建一个新列。然后你的表 2 将有相同的代码顺序,然后你就可以加入了。

标签: sql database tsql


【解决方案1】:

如果我理解正确,您希望行之间完全匹配,其中项目需要完全匹配。

您的数据模型很差。在数据库中,您不应该在列中存储重复的值。相反,您应该将它们存储在行中。

但是,反透视数据非常容易:

with t1 as (
      select t1.*, v.item,
             count(*) over (partition by user_id) as cnt
      from table1 t1 cross apply
           (values (t1.item_1), (t1.item_2), (t1.item_3)
           ) v(item)
      where v.item is not null
     ),
     t2 as (
      select t2.*, v.item,
             count(*) over (partition by role) as cnt
      from table2 t2 cross apply
           (values (t2.item_1), (t2.item_2), (t2.item_3)
           ) v(item)
      where v.item is not null
     )
select t1.user_id, t1.user_name, t2.role
from t1 join
     t2
     on t1.item = t2.item and t1.cnt = t2.cnt
group by t1.user_id, t1.user_name, t2.role, t1.cnt
having count(*) = t1.cnt;

【讨论】:

  • 非常感谢!我什至不知道 select over 子句和 cross apply。
猜你喜欢
  • 2020-07-20
  • 2012-01-04
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
  • 1970-01-01
相关资源
最近更新 更多