gpt4 book ai didi

sql - 存在与不存在查询误区?

转载 作者:搜寻专家 更新时间:2023-10-30 21:45:57 25 4
gpt4 key购买 nike

考虑以下产品数据库架构:

  • Parts (pid, pname)
  • Suppliers (sid, 名字)
  • Catalog (sid, pid)

sidCatalog是一个外键和引用 SupplierspidCatalog是外键并引用 Parts table 。 (s1, p1)Catalog表显示供应商s1生产 p1 .

如果我想找到 Parts 的详细信息一些供应商不提供,我们如何才能做到这一点?我读了一些部分如下:

SELECT *
FROM parts P
WHERE ....... (SELECT S.sid
FROM suppliers
WHERE .....
(SELECT *
FROM catalog C
WHERE s.sid = C.sid AND P.pid = C.pid))

我的问题是通过 - 为什么一开始?我们使用 exist,其次……我们使用 not exist?

最佳答案

If I want find details of Parts that are not supplied by some suppliers, how we can do this?

如果您想要“存在不提供该零件的供应商的零件的详细信息”,那么您的查询(使用 EXISTS 然后使用 NOT EXISTS)是正确的。

My problem is via - why at first? We use exist and in second ... we use not exist?

我将解释为什么“存在不提供该零件的供应商的零件的详细信息”可以提供您的查询。 (使用 EXISTS 然后使用 NOT EXISTS。)

一个表包含使某些谓词(语句模板)成为真正的命题(语句)的行:

  • 部分 "部分P.pid被命名为P.pname"
  • Suppliers “供应商 S.sid 名为 S.sname”
  • Catalog "supplier C.sid supplys part C.pid"

您需要为您的结果表达谓词。您需要 P.pid-P.pname 行,从中做出真实的陈述:

    "part P.pid is named P.pname"
AND EXISTS S.sid ["supplier S.sid is named something"
AND NOT "supplier S.sid supplies part P.pid"]

但是我们必须根据给定的谓词(加上条件和逻辑运算符)来表达这个谓词,以便 DBMS 可以计算满足它的行:

    "part P.pid is named P.pname"
AND EXISTS S.sid [EXISTS S.sname "supplier S.sid is named S.sname"
AND NOT EXISTS C.sid, C.pid [
"supplier C.sid supplies part P.pid" AND C.sid = S.sid AND C.pid = P.pid]]

现在转换为SQL:

  • T 的初始 谓词 变为 FROMT
  • AND T 的谓词 变为 JOINT
  • AND condition 变为 WHEREconditionON条件
  • 最外层的 EXISTS dropped columns 变为 SELECTkept columns
  • other EXISTS T 的所有列 [T 的谓词] 变为 EXISTS (T/em>)

SELECT *
FROM Parts P
WHERE EXISTS (SELECT S.sid FROM Suppliers S
WHERE NOT EXISTS (SELECT 1 FROM Catalog C
WHERE C.sid = S.sid AND C.pid = P.pid))

PS 您问题的原始“部分供应商未提供的零件的详细信息”不清楚/模棱两可。这可能意味着 P.id-P.pname 对,其中:

  1. “零件并非由所有供应商提供”(与您的 SQL 一致的解释)
  2. “零件并非未供应(由任何供应商提供)”(与Shnugo's answer中两个SQL版本一致的解释
  3. “零件没有多个供应商”

    SELECT * FROM Parts P
    WHERE NOT EXISTS (SELECT *
    FROM Catalog C1 JOIN Catalog C2 ON C1.sid <> C2.sid
    AND C1.pid = P.pid AND C2.pid = P.pid)

如果您有 Parts 1-4 和 Suppliers 1-3 那么上面给出了三个不同的答案:

INSERT INTO Catalog VALUES (1,1),(2,1),(2,2),(3,1),(3,2),(3,3);

PPS 以上的逻辑公式是:

-- 1. "the parts are not supplied by all the suppliers"  
P(P.pid, P.pname)
AND EXISTS S.sid, S.sname [S(S.sid, S.sname) AND NOT C(S.sid, P.pid)]
-- 2 "the parts are not supplied (by some of the suppliers)"
P(P.pid, P.pname) AND NOT EXISTS C.sid C(C.sid, P.pid)
-- 3. "the parts don't have multiple suppliers"
P(P.pid, P.pname)
AND NOT EXISTS C1.sid, C2.sid
[C(C1.sid, P.pid) AND C(C2.sid, P.pid) AND C1.sid <> C2.sid]

关于sql - 存在与不存在查询误区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35398701/

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