【问题标题】:Join operations in SQLSQL 中的连接操作
【发布时间】:2022-07-30 21:24:12
【问题描述】:

我应该检索不包含在任何冰淇淋中的成分的 ID 和名称,然后 按成分 ID 升序对输出行进行排序。我不太明白 JOIN 操作在这个练习中是如何工作的。

我试过了,例如以下,但它在输出中提供了太多行。

SELECT ingredient.ingredient_id, ingredient.ingredient_name
FROM ingredient
LEFT JOIN contains ON ingredient.ingredient_id != contains.ingredient_id
LEFT JOIN ice_cream ON ice_cream.ice_cream_id != contains.ice_cream_id
ORDER BY ingredient.ingredient_id;

输出列应如下所示:

ingredient_id  ingredient_name

----------------------------

6              Dark chocolate

下面是表格:

CREATE TABLE manufacturer (
    manufacturer_id INT,
    manufacturer_name VARCHAR(30) NOT NULL,
    country VARCHAR(30) NOT NULL,
    PRIMARY KEY (manufacturer_id),
    UNIQUE (manufacturer_name)
);

-- jäätelöitä
-- ice creams

CREATE TABLE ice_cream (
    ice_cream_id INT,
    ice_cream_name VARCHAR(30) NOT NULL,
    manufacturer_id INT NOT NULL,
    manufacturing_cost NUMERIC(4,2),
    PRIMARY KEY (ice_cream_id),
    UNIQUE (ice_cream_name),
    FOREIGN KEY (manufacturer_id) REFERENCES manufacturer
);

-- aineksia
-- ingredients
-- plant_based arvo 0 merkitse ei ja arvo 1 merkitsee kyllä
-- plant_based value 0 means no and value 1 means yes 

CREATE TABLE ingredient (
    ingredient_id INT,
    ingredient_name VARCHAR(30) NOT NULL,
    kcal INT,
    protein NUMERIC(3,1),
    plant_based INT,
    PRIMARY KEY (ingredient_id),
    UNIQUE (ingredient_name)
);

-- jäätelöt sisältävät aineksia
-- ice creams contain ingredients

CREATE TABLE contains(
    ice_cream_id INT NOT NULL,
    ingredient_id INT NOT NULL,
    quantity INT,
    PRIMARY KEY (ice_cream_id, ingredient_id),
    FOREIGN KEY (ice_cream_id) REFERENCES ice_cream,
    FOREIGN KEY (ingredient_id) REFERENCES ingredient
);




--Ice cream manufacturers
INSERT INTO manufacturer VALUES (
    1, 'Jen & Berry', 'Canada'
);

INSERT INTO manufacturer VALUES (
    2, '4 Friends', 'Finland'
);

INSERT INTO manufacturer VALUES (
    3, 'Gelatron', 'Italy'
);

--Ice cream

INSERT INTO ice_cream VALUES (
    1, 'Plain Vanilla', 1, 1.00
);

INSERT INTO ice_cream VALUES (
    2, 'Vegan Vanilla', 2, 0.89
);

INSERT INTO ice_cream VALUES (
    3, 'Super Strawberry', 2, 1.44
);

INSERT INTO ice_cream VALUES (
    4, 'Very plain', 2, 1.20
);


--Ingredients
INSERT INTO ingredient VALUES (
    1, 'Cream', 400, 3, 0
);

INSERT INTO ingredient VALUES (
    2, 'Coconut cream', 230, 2.3, 1
);

INSERT INTO ingredient VALUES (
    3, 'Sugar', 387, 0, 1
);

INSERT INTO ingredient VALUES (
    4, 'Vanilla extract', 12, 0, 1
);


INSERT INTO ingredient VALUES (
    5, 'Strawberry', 33, 0.7, 1
);

INSERT INTO ingredient VALUES (
    6, 'Dark chocolate', 535, 8, 1
);


--Contains

INSERT INTO contains VALUES ( 
    1, 1, 70
);
INSERT INTO contains VALUES ( 
    1, 3, 27
);
INSERT INTO contains VALUES ( 
    1, 4, 3
);


INSERT INTO contains VALUES ( 
    2, 2, 74
);
INSERT INTO contains VALUES ( 
    2, 3, 21
);
INSERT INTO contains VALUES ( 
    2, 4, 5
);

INSERT INTO contains VALUES ( 
    3, 1, 60
);
INSERT INTO contains VALUES ( 
    3, 3, 10
);
INSERT INTO contains VALUES ( 
    3, 5, 30
);


INSERT INTO contains VALUES ( 
    4, 2, 95
);
INSERT INTO contains VALUES ( 
    4, 4, 5
);

【问题讨论】:

  • 此问题包含您要问的内容、您尝试过的内容、示例数据和 DML 以及所需的结果。我希望我能十次投票赞成你的问题,太好了,欢迎来到 SO :)

标签: sql


【解决方案1】:

您可以使用LEFT JOIN 将“contains”表与“ingredient”表连接起来,并过滤“contains”中具有 NULL 的所有值.ice_cream_id" 字段:

SELECT i.ingredient_id,
       i.ingredient_name,
       c.ice_cream_id
FROM      ingredient i
LEFT JOIN contains   c
       ON i.ingredient_id = c.ingredient_id
WHERE c.ice_cream_id IS NULL

【讨论】:

  • 您不需要子查询,只需在内部查询中添加WHERE contains.ice_cream_id IS NULLdbfiddle.uk/…
  • 你说得对,我已经更新了答案。这很有用!
【解决方案2】:

您似乎是在要求查找某些东西在哪里不存在,因此使用not exists 表达这一点是有意义的

所以你只需要找到内容列表中不存在的成分:

select ingredient_id, ingredient_name
from ingredient i
where not exists (
  select * from contains c 
  where c.ingredient_id = i.ingredient_id
);

Demo Fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    相关资源
    最近更新 更多