基于关键字在组中搜索匹配的字符串

oknrviil  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(351)

场景:考虑一家餐厅,每当菜单上必须添加新的项目时,项目必须首先得到餐厅经理的批准或拒绝。被拒绝或响应为空的项目存储在名为denials的表中,如下所示。

经过进一步检查,可以发现有些条目的响应为空,因为对于某些项目,经理将响应保留为空,而是手动添加另一行,然后将该行标记为拒绝。
例如,经理将草莓芝士蛋糕和覆盆子芝士蛋糕的回复留空,并在新的一行中添加了“浆果味芝士蛋糕”项,并将其标记为“拒绝”。本手册解释了草莓和覆盆子芝士蛋糕的拒绝。我们在其他组中也看到类似的例子,例如,双胡萝卜蛋糕和番茄蛋糕通过创建一个新的素食风味蛋糕手工输入行,被集体标记为拒绝。
要求是,对于每个响应为空的行,我们需要找到具有拒绝响应的等效项。为了解决这个问题,我们已经创建了一个名为lookup的关键字查找表,其中包含需要在item列中搜索的关键字,以便找到具有拒绝响应的匹配项。

最终所需输出如下所示:

注意:生成的匹配项应在同一组中。例如,在d组,酸果蔓芝士蛋糕有一个空白React。蔓越莓芝士蛋糕的查找关键字是berry。因此,如果我们忽略组列,那么匹配的项目将是浆果口味的芝士蛋糕。但是,搜索范围必须在同一组内,即d组。由于组d没有任何与查找关键字berry匹配的项,因此预期的结果是没有响应。
我不知道怎样才能得到想要的输出。我需要帮助。
下面是用于为denails和查找表创建架构和数据的sql脚本:

CREATE TABLE [denials](
    [group] [nvarchar](50) NOT NULL,
    [item] [nvarchar](255) NOT NULL,
    [manager_response] [nvarchar](255) NULL
)

CREATE TABLE [lookup](
    [item] [nvarchar](255) NOT NULL,
    [lookup_keyword] [nvarchar](255) NULL
)

INSERT [denials] ([group], [item], [manager_response]) VALUES ('A', 'lemon cheesecake', 'denied')
INSERT [denials] ([group], [item], [manager_response]) VALUES ('A', 'strawberry cheesecake', NULL)
INSERT [denials] ([group], [item], [manager_response]) VALUES ('A', 'raspberry cheesecake', NULL)
INSERT [denials] ([group], [item], [manager_response]) VALUES ('A', 'berry flavored cheesecake', 'denied')
INSERT [denials] ([group], [item], [manager_response]) VALUES ('B', 'apple cheesecake', 'denied')
INSERT [denials] ([group], [item], [manager_response]) VALUES ('B', 'blueberry cheesecake', 'denied')
INSERT [denials] ([group], [item], [manager_response]) VALUES ('B', 'orange cheesecake', 'denied')
INSERT [denials] ([group], [item], [manager_response]) VALUES ('B', 'double carrot cake', NULL)
INSERT [denials] ([group], [item], [manager_response]) VALUES ('B', 'tomato cake', NULL)
INSERT [denials] ([group], [item], [manager_response]) VALUES ('B', 'veggie flavored cake', 'denied')
INSERT [denials] ([group], [item], [manager_response]) VALUES ('C', 'red grapes cheesecake', NULL)
INSERT [denials] ([group], [item], [manager_response]) VALUES ('C', 'green grapes cheesecake', NULL)
INSERT [denials] ([group], [item], [manager_response]) VALUES ('C', 'grape flavored cheesecake', 'denied')
INSERT [denials] ([group], [item], [manager_response]) VALUES ('D', 'cranberry cheesecake', NULL)
INSERT [denials] ([group], [item], [manager_response]) VALUES ('D', 'cinnamon cheesecake', 'denied')

INSERT [lookup] ([item], [lookup_keyword]) VALUES ('strawberry cheesecake', 'berry')
INSERT [lookup] ([item], [lookup_keyword]) VALUES ('raspberry cheesecake  ', 'berry')
INSERT [lookup] ([item], [lookup_keyword]) VALUES ('double carrot cake', 'veggie')
INSERT [lookup] ([item], [lookup_keyword]) VALUES ('tomato cake', 'veggie')
INSERT [lookup] ([item], [lookup_keyword]) VALUES ('red grapes cheesecake', 'grape')
INSERT [lookup] ([item], [lookup_keyword]) VALUES ('green grapes cheesecake', 'grape')
INSERT [lookup] ([item], [lookup_keyword]) VALUES ('cranberry cheesecake', 'berry')
gc0ot86w

gc0ot86w1#

试试这个:

SELECT A.[group]
      ,A.[Item]
      ,A.[manager_response]
      ,C.[Item]
FROM [denials] A
LEFT JOIN [lookup] B
    ON A.[item] = B.[item]
LEFT JOIN [denials] C
    ON A.[group] = C.[group]
    AND C.[item] LIKE B.[lookup_keyword] + '%'
    AND B.[item] <> C.[item];

相关问题