0

假设我们有以下架构:

CREATE TABLE customers(
    id INTEGER PRIMARY KEY, 
    name TEXT
);
CREATE TABLE items(
    id INTEGER PRIMARY KEY, 
    name TEXT
);
CREATE TABLE customers_items(
    customerid INTEGER, 
    itemid INTEGER, 
    FOREIGN KEY(customerid) REFERENCES customers(id),
    FOREIGN KEY(itemid) REFERENCES items(id)
);

现在我们插入一些示例数据:

INSERT INTO customers(name) VALUES ('John');
INSERT INTO customers(name) VALUES ('Jane');

INSERT INTO items(name) VALUES ('duck');
INSERT INTO items(name) VALUES ('cake');

假设 John 和 Jane 的 id 为 1 和 2,duck 和 cake 的 id 也为 1 和 2。让我们给 John 一个鸭子,给 Jane 一个鸭子和一个蛋糕。

INSERT INTO customers_items(customerid, itemid) VALUES (1, 1);
INSERT INTO customers_items(customerid, itemid) VALUES (2, 1);
INSERT INTO customers_items(customerid, itemid) VALUES (2, 2);

现在,我想做的是运行两种类型的查询:

  1. 选择同时拥有鸭子和蛋糕的客户的姓名(应仅返回“Jane”)。
  2. 选择有鸭子但没有蛋糕的客户的姓名(应仅返回“约翰”)。
4

1 回答 1

1

对于列出的两种类型的查询,您可以使用 EXISTS 子句。下面是使用 exists 子句的示例查询:

SELECT cust.name 
from customers AS cust
WHERE EXISTS (
     SELECT 1
     FROM items
     INNER JOIN customers_items ON items.id = customers_items.itemid
     INNER JOIN customers on customers_items.customerid = cust.id
     WHERE items.name = 'duck')
AND NOT EXISTS (
     SELECT 1
     FROM items
     INNER JOIN customers_items ON items.id = customers_items.itemid
     INNER JOIN customers on customers_items.customerid = cust.id
     WHERE items.name = 'cake')

这是一个工作示例:http ://sqlfiddle.com/#!6/3d362/2

于 2015-05-01T17:20:16.877 回答