gpt4 book ai didi

SQL - 比较两组

转载 作者:行者123 更新时间:2023-12-04 22:14:56 25 4
gpt4 key购买 nike

比方说,我有员工,我知道他们喜欢什么水果。

fruits(name, fruit_name)

我的问题是:列出至少和 Donald 喜欢同样水果的所有员工。

那么如何比较两组值呢?

这就是我得到 Donald 喜欢的水果的方式:

Select name, fruit_name
from fruits
where initcap(name) like '%Donald%';

示例:唐纳德喜欢苹果、梨和桃子。我需要喜欢苹果、梨、桃子和其他可能水果的人,但他们必须喜欢这 3 种。

最佳答案

两种方法:

使用集合

我发现这给出了最容易理解的 SQL,但它确实需要定义一个集合类型:

CREATE TYPE VARCHAR2s_Table AS TABLE OF VARCHAR2(20);

然后您可以将所有内容分组到集合中并使用自连接和 SUBMULTISET OF 来查找其他名称。

WITH grouped AS (
SELECT name,
CAST( COLLECT( fruit ) AS VARCHAR2s_Table ) AS list_of_fruits
FROM fruits
GROUP BY name
)
SELECT g.name
FROM grouped f
INNER JOIN
grouped g
ON ( f.list_of_fruits SUBMULTISET OF g.list_of_fruits
AND f.name <> g.name )
WHERE f.name = 'Alice';

SQLFIDDLE

或者这个的替代版本:

WITH grouped AS (
SELECT name,
CAST( COLLECT( fruit ) AS VARCHAR2s_Table ) AS list_of_fruits
FROM fruits
GROUP BY name
)
SELECT name
FROM grouped
WHERE name <> 'Alice'
AND ( SELECT list_of_fruits FROM grouped WHERE name = 'Alice' )
SUBMULTISET OF list_of_fruits ;

不使用集合

WITH match_by_user AS (
SELECT DISTINCT
name,
fruit
FROM fruits
WHERE name = 'Alice'
)
SELECT f.name
FROM fruits f
INNER JOIN
match_by_user m
ON ( f.fruit = m.fruit
AND f.name <> m.name )
GROUP BY f.name
HAVING COUNT( DISTINCT f.fruit ) = ( SELECT COUNT(1) FROM match_by_user );

SQLFIDDLE

顺便说一句 - 使用 INITCAP(Name) LIKE '%Name%' 有可能匹配多个名称,您可能会发现您正在寻找几个人中的一个喜欢的水果。

关于SQL - 比较两组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19807987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com