sql - 如何根据来自 2 列或更多列的数据匹配一列中的数据
问题描述
我在尝试这样做时遇到了一些麻烦,所以如果有人能指出我正确的方向,我将不胜感激。
所以excel文件中的数据是这样的:
Work Title | Composers/Authors
------------------------------------------------------------------------------------
ACIDS ROCKS | BARLOW/FOSTER
ABOVE CLOUDS | JEFF BECK,CYNDI LAUPER,JED LEIBER
DB中的数据与作者中的数据相似,也可以是全名或只是姓氏,但它们是分开的。
现在我想将该数据与数据库中的数据进行匹配,例如:
Work Title | Composers/Authors
------------------------------------------------------------------------------------
ACIDS ROCKS | DARREN JAMES BARLOW
ACIDS ROCKS | FOSTER
在这种情况下,期望的结果是这两个作品匹配(返回的值可能是与数据库中的标题相关联的 ID),但如果作品不包含带有“FOSTER”的记录,则两部作品不应该匹配。
标题应该 100% 匹配(例如,如果标题是 THE ACIDS ROCKS,则它不会匹配)并且作者应该只包含姓氏,否则根据给定的数据可能很难准确匹配它们。
希望这说明清楚。
编辑:
在查看了更多数据并尝试以更容易的方式对其进行编译之后,它现在应该如下所示:
数据库中的数据
Work Title | Composers/Authors
------------------------------------------------------------------------------------
ACIDS ROCKS | DARREN JAMES BARLOW
ACIDS ROCKS | FOSTER
excel表格中的数据
Work Title | Composers/Authors
------------------------------------------------------------------------------------
ACIDS ROCKS | FOSTER
ACIDS ROCKS | DARREN JAMES BARLOW
因此,为了简单起见,我只需要数据 100% 相同,因此如果标题匹配(在本例中为 ACIDS ROCKS),则查询应检查作者是否相同(在本例中,它们是但不相同命令)。我在让它单独检查每一行时遇到问题。此处所需的输出将是匹配的作品,因为它们具有相同的标题和作者,但是例如,如果数据库数据看起来像
Work Title | Composers/Authors
------------------------------------------------------------------------------------
ACIDS ROCKS | DARREN JAMES BARLOW
ACIDS ROCKS | MARK FOSTER
那么它不应该匹配。即使 FOSTER 丢失或我们在数据库中有其他作者,它也不应该匹配(不确定限制这一点有多难)
解决方案
如果您的 Db2 用于 Linux、Unix 和 Windows,请按原样运行以下命令。
您可以取消注释已注释掉的行并注释掉它上面的行以检查差异。
WITH
EXCEL_TABLE (Title, Author) AS
(
VALUES
('ACIDS ROCKS', 'FOSTER')
, ('ACIDS ROCKS', 'DARREN JAMES BARLOW')
)
, DB_TABLE (Title, Author) AS
(
VALUES
('ACIDS ROCKS', 'DARREN JAMES BARLOW')
, ('ACIDS ROCKS', 'FOSTER')
--, ('ACIDS ROCKS', 'MARK FOSTER')
)
SELECT E.Title, E.Authors
FROM
(
SELECT Title, LISTAGG(Author, ',') WITHIN GROUP (ORDER BY Author) AS Authors
FROM EXCEL_TABLE
GROUP BY Title
) E
JOIN
(
SELECT Title, LISTAGG(Author, ',') WITHIN GROUP (ORDER BY Author) AS Authors
FROM DB_TABLE
GROUP BY Title
) D ON D.Title = E.Title AND D.Authors = E.Authors;
推荐阅读
- javascript - 如何在移动时通过网络摄像头检测/定位地板/地面
- python - Python中的嵌套类枚举类
- python-3.x - 检查多个字符串是否在另一个字符串中
- javascript - 如何播放 .wav 文件
- android - 使用像 gridview 这样的 Recyclerview
- java - 是否可以将元素添加到 SparseArray 的前面?
- python - 在不同的 Docker 容器中跨 Python 脚本的 IPC 共享内存
- javascript - Uncaught TypeError: $.get is not a function at
:1:3 - javascript - 我无法让我的 javascript 来切换我的登录下拉菜单。为什么javascript没有连接到我的html?
- ansible - ansible:如何将 selectattr 与 ipaddr 过滤器一起使用