我在一个oracle sql数据库中工作,有两个表,一个有一个坏属性组合列表,另一个有一个用户及其属性列表.就像这样:

组合ID 项目1 项目2
1 冰淇淋 辣酱
2 芦笋 chocolatey
3 花生酱 牛排
4 芦笋 冰淇淋
用户属性ID 用户 项目
1 A1 冰淇淋
2 B2 芦笋
3 A1 chocolatey
4 B2 冰淇淋
5 C3 牛排
6 C3 冰淇淋
7 C3 chocolatey

在本例中,我希望标记用户B2,但不希望标记A1或C3.

我的预期结果是:

用户 Bad_Combo_ID
B2 4

一般来说,我try 过的每一件事要么看起来不必要地复杂和缓慢,要么在上面的例子中标记了A1和C3.

推荐答案

根据我对您问题的理解,您需要这样做:

WITH user_items AS
  (SELECT 
    username,
    LISTAGG(item,',') AS item_list
  FROM attributes
  GROUP BY username)
SELECT 
  ROW_NUMBER() 
    OVER(ORDER BY u.username) AS Bad_Combo_User_ID,
  u.username, 
  c.ComboID
FROM user_items u
INNER JOIN combinations c ON
  INSTR(u.item_list, c.item1) > 0
  AND INSTR(u.item_list, c.item2) > 0;

我根据您的样本数据创建了一个sample fiddle,并使用用户D4和E5的一些数据进行了扩展.

我认为结果是正确的,符合您的要求.

此查询如何工作?

首先,我们使用CTE来构建一个逗号分隔的列表,其中包含每个用户在属性表中显示的所有项目.

然后,我们使用主查询将条目列表与组合表中的条目进行比较.在INNER JOIN的第ON条中,我们说同一行中组合表中的两个项目必须出现在用户的"项目列表"中.如果是这种情况,我们将该用户添加到结果中.

因此,结果将只显示那些具有无效项目组合的用户.ROW_NUMBER只是根据用户名创建一个递增的数字.当我读到你的问题时,这就是你想要做的.

即使我理解错了什么,而且答案也不是100%你想做的,我认为这应该是足够的帮助,为你指明正确的方向.请让我们知道.

Sql相关问答推荐

在SQL中对字符串进行逻辑排序,将数字部分排序为数字值

如何优化我的功能以减少花费的时间?

PostgreSQL使用SQL子查询在时间间隔内 Select 数据

直接加法(1+1)与聚合函数SUM(1+1)的区别是什么

两个不同星期的销售额,不加成一行

正在try 从SQL获取最新的ID和一个唯一名称

Oracle分层查询-两条路径在末尾合并为一条

如何为缺少的类别添加行

违反了完整性约束-值存在时找不到父键

从输出中删除 jsonb_build_object

SQL 查找 varchar 类型列及其值中多次出现的子字符串

将空 JSON 数组添加到 SQL Server 表列中的 JSON 字符串

Clickhouse:左连接表到外部数组

SQL 多个不满足的条件失败

在 MS Access VBA 中,如何测量显示查询的时间?

Clob 问题 - 将 clob 列拆分为多行

joins 组合多个重复数据删除策略

PostgreSQL:通过数组的元素从另一个表中 Select 数据,然后按顺序显示

SELECT 用于 Parent、Children 和 ORDER BY [Order] 列

连接表时避免重复