首页 > 解决方案 > 如何根据来自 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 丢失或我们在数据库中有其他作者,它也不应该匹配(不确定限制这一点有多难)

标签: sqlstringdb2

解决方案


如果您的 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;

推荐阅读