gpt4 book ai didi

SQL |如果存在另一个具有相等 (b,c) 的元组,则列出所有元组 (a, b, c)

转载 作者:行者123 更新时间:2023-12-03 23:03:23 24 4
gpt4 key购买 nike

我有三个表,其中粗体属性是主键

  • 餐厅( restaurant_ID ,名称,...)
  • resturant_ID,  name,       ...
    1, Macdonalds
    2, Hubert
    3, Dorsia
    ... ...
  • 标识符( restaurant_ID , food_ID )
  • restaurant_ID, food_ID, ...
    1, 1
    1, 4
    2, 1
    2, 7
    ... ...
  • 食物( food_ID , name, ...)
  • food_ID    food_name
    1 Chips
    2 Burgers
    3 Salmon
    ... ...
    使用 postgres 我想列出所有与至少一家其他餐厅共享完全相同食物的餐厅(restaurant_id 和 name - 每家餐厅 1 行)。
    例如,让我们说
  • ID为“1”的餐厅有只有关联的 food_id 的 1 和 4,如 Identifier 所示
  • ID为“3”的餐厅有只有关联的 food_id 的 4 和 1,如 Identifier 所示
  • ID为“7”的餐厅有只有关联的 food_id 的 6 如 Identifier 所示
  • ID为“9”的餐厅有只有关联的 food_id 的 6 如 Identifier 所示
  • 然后输出
  • Restaurant_id      name
    1 name1
    3 name3
    7 ...
    9 ...
    任何帮助将不胜感激!
    谢谢

    最佳答案

    使用聚合函数 string_agg()获取每家餐厅的完整食物 list :

    with cte as (
    select restaurant_ID,
    string_agg(food_ID::varchar(10),',' order by food_ID) foods
    from identifier
    group by restaurant_ID
    )
    select r.*
    from Restaurants r inner join cte c
    on c.restaurant_ID = r.restaurant_ID
    where exists (select 1 from cte where restaurant_ID <> c.restaurant_ID and foods = c.foods)
    但我更愿意根据匹配的食物对餐馆进行分组:
    with cte as (
    select restaurant_ID,
    string_agg(food_ID::varchar(10),',' order by food_ID) foods
    from identifier
    group by restaurant_ID
    )
    select string_agg(r.name, ',') restaurants
    from Restaurants r inner join cte c
    on c.restaurant_ID = r.restaurant_ID
    group by foods
    having count(*) > 1
    demo .

    关于SQL |如果存在另一个具有相等 (b,c) 的元组,则列出所有元组 (a, b, c),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64181344/

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