Select 行有一组特定的项目通过连接 table
Select rows that have a specific set of items associated with them through a junction table
假设我们有以下架构:
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。
让我们给约翰一只鸭子,给简一只鸭子和一个蛋糕。
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);
现在,我想做的是运行两种类型的查询:
- Select 既有鸭子又有蛋糕的顾客姓名(只应 return 'Jane')。
- Select 有鸭子但没有蛋糕的顾客的名字(应该 return 'John')。
对于列出的两种类型的查询,您可以使用 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
假设我们有以下架构:
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。 让我们给约翰一只鸭子,给简一只鸭子和一个蛋糕。
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);
现在,我想做的是运行两种类型的查询:
- Select 既有鸭子又有蛋糕的顾客姓名(只应 return 'Jane')。
- Select 有鸭子但没有蛋糕的顾客的名字(应该 return 'John')。
对于列出的两种类型的查询,您可以使用 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