我正在做一个练习 case ,我有这些表格:

    CREATE TABLE customer_orders (
      "order_id" INTEGER,
      "customer_id" INTEGER,
      "pizza_id" INTEGER,
      "exclusions" VARCHAR(4),
      "extras" VARCHAR(4),
      "order_time" DATETIME
    );
    INSERT INTO customer_orders
      ("order_id", "customer_id", "pizza_id", "exclusions", "extras", "order_time")
    VALUES
      ('1', '101', '1', '', '', '2020-01-01 18:05:02'),
      ('2', '101', '1', '', '', '2020-01-01 19:00:52'),
      ('3', '102', '1', '', '', '2020-01-02 23:51:23'),
      ('3', '102', '2', '', NULL, '2020-01-02 23:51:23'),
      ('4', '103', '1', '4', '', '2020-01-04 13:23:46'),
      ('4', '103', '1', '4', '', '2020-01-04 13:23:46'),
      ('4', '103', '2', '4', '', '2020-01-04 13:23:46'),
      ('5', '104', '1', NULL, '1', '2020-01-08 21:00:29'),
      ('6', '101', '2', NULL, NULL, '2020-01-08 21:03:13'),
      ('7', '105', '2', NULL, '1', '2020-01-08 21:20:29'),
      ('8', '102', '1', NULL, NULL, '2020-01-09 23:54:33'),
      ('9', '103', '1', '4', '1, 5', '2020-01-10 11:22:59'),
      ('10', '104', '1', NULL, NULL, '2020-01-11 18:34:49'),
      ('10', '104', '1', '2, 6', '1, 4', '2020-01-11 18:34:49');
    
    
    CREATE TABLE pizza_toppings (
      "topping_id" INTEGER,
      "topping_name" VARCHAR(50)
    );
    INSERT INTO pizza_toppings
      ("topping_id", "topping_name")
    VALUES
      (1, 'Bacon'),
      (2, 'BBQ Sauce'),
      (3, 'Beef'),
      (4, 'Cheese'),
      (5, 'Chicken'),
      (6, 'Mushrooms'),
      (7, 'Onions'),
      (8, 'Pepperoni'),
      (9, 'Peppers'),
      (10, 'Salami'),
      (11, 'Tomatoes'),
      (12, 'Tomato Sauce')

CREATE TABLE pizza_names (
  "pizza_id" INTEGER,
  "pizza_name" VARCHAR
);
INSERT INTO pizza_names
  ("pizza_id", "pizza_name")
VALUES
  (1, 'Meatlovers'),
  (2, 'Vegetarian');

我被问到: 以以下格式之一为Customers_Orders表中的每个记录生成订单项目:

  • 肉食者
  • 肉食者 - Exclude Beef
  • 肉食者 - Extra Bacon
  • 肉食者 - Exclude Cheese, Bacon - Extra Mushroom, Peppers

到目前为止,我已经能够做到这一点:

--for Extras
  SELECT concat(cast(pn.pizza_name as varchar), pt.topping_name ) as pizzas_plus_extras
FROM customer_orders as co
    CROSS APPLY string_split((extras), ',') 
full JOIN pizza_toppings as pt
ON VALUE in (cast(topping_id as varchar))
INNER JOIN pizza_names AS pn
ON co.pizza_id = pn.pizza_id

--for exclusions

SELECT concat(cast(pn.pizza_name as varchar), pt.topping_name ) as pizzas_plus_exclusions
FROM customer_orders as co
    CROSS APPLY string_split((exclusions), ',') 
full JOIN pizza_toppings as pt
ON VALUE in (cast(topping_id as varchar))
INNER JOIN pizza_names AS pn
ON co.pizza_id = pn.pizza_id

这给了我以下结果:

enter image description here

由于某种原因,它不想显示所有的记录(在额外的,它不会命名浇头编号5和4,同样的事情与排除编号6),我有两个不同的表,我不知道如何连接和获得我被要求的结果.

我try 了String_agg添加一个分隔符,但我在每个表上都使用了它,所以,正如您所看到的,我仍然无法获得预期的结果.

如有任何帮助,我们不胜感激!

推荐答案

使用STRING_SPLIT连接带有逗号分隔ID的列.Notice: in real world this is a bad practice.

对于临时演员:

SELECT co.order_id,co.customer_id,pn.pizza_name + '-' + pt.topping_name as pizza
FROM customer_orders co
inner join pizza_names pn on co.pizza_id = pn.pizza_id
inner join pizza_toppings pt on pt.topping_id in  (select * from string_split(co.extras, ','))

UPDATE:

-- ALL Meat Lovers (NO EXTRAS NO EXCLUSIONS)
Select co.order_id,co.customer_id,pn.pizza_name
FROM customer_orders co
inner join pizza_names pn on co.pizza_id = pn.pizza_id
where pn.pizza_name='Meatlovers'
and 
(
 (exclusions is null or exclusions = '')
  AND
 (extras is null or extras = '')
 )

-- ALL PIZZAS (EXCLUDE BEEF)
SELECT co.order_id,co.customer_id,pn.pizza_name + '-' + pt.topping_name as pizza
FROM customer_orders co
inner join pizza_names pn on co.pizza_id = pn.pizza_id
inner join pizza_toppings pt on pt.topping_id in  (select * from string_split(co.exclusions, ','))
and pt.topping_name <>'Beef'

-- ALL PIZZAS (EXTRA BACON)
SELECT co.order_id,co.customer_id,pn.pizza_name + '-' + pt.topping_name as pizza
FROM customer_orders co
inner join pizza_names pn on co.pizza_id = pn.pizza_id
inner join pizza_toppings pt on pt.topping_id in  (select * from string_split(co.extras, ','))
and pt.topping_name= 'Bacon'

-- ALL PIZZAS (EXCLUDE CHEESE,BACON - EXTRA MUSHROOM, PEPPERS)

SELECT co.order_id,co.customer_id,pn.pizza_name + '-' + pt.topping_name as pizza
FROM customer_orders co
inner join pizza_names pn on co.pizza_id = pn.pizza_id
inner join pizza_toppings pt on pt.topping_id in  (select * from string_split(co.exclusions, ','))
and pt.topping_name<> 'Bacon' and pt.topping_name<> 'Cheese'
inner join pizza_toppings pt1 on pt1.topping_id in  (select * from string_split(co.extras, ','))
and pt1.topping_name='Mushrooms'or pt1.topping_name='Peppers'

Sql相关问答推荐

将SEMI JOIN、ANTI JOIN转换为非连接SQL

SQL查询组类值在同一行中,并连接和排序其他值

SQL基于多个值 Select 单行

我希望以正确的升序获取SQL结果.怎样才能得到它们?

重新组合已排序的日期范围

判断序列索引处的序列是否完整

NULL-生成的列中连接的字符串的输入

我可以在SQL的IN子句中使用比子查询包含的值更少的值吗?

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

带上最后日期(结果)

在Postgres中合并相似的表

仅当 SQL Server 中的表为开时,才在存储过程中使用更改跟踪

如何向 mariadb 添加外键?

如何在 JSONB 数组的每个对象中添加新的键值对- PostgreSQL

创建定时器以更新Gridview

PostgreSQL分割字符串为子词并判断其是否存在于其他字符串中

检索具有相同位置的最小和最大store 数量

在多个表上递归查找

Set vs let vs 在snowflake中声明变量

如何通过子 Select 在一次更新(并行数组)中多次更新相同的行