首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过连接表选择具有特定项集的行。

通过连接表选择具有特定项集的行。
EN

Stack Overflow用户
提问于 2015-05-01 16:13:50
回答 1查看 99关注 0票数 0

假设我们有以下模式:

代码语言:javascript
运行
复制
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)
);

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

代码语言:javascript
运行
复制
INSERT INTO customers(name) VALUES ('John');
INSERT INTO customers(name) VALUES ('Jane');

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

让我们假设约翰和简的身份证是1和2,鸭子和蛋糕的id也是1和2。让我们给约翰一只鸭子,给简一只鸭子和一块蛋糕。

代码语言:javascript
运行
复制
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. 选择有鸭子而没有蛋糕的顾客的名字(应该只返回“John”)。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-01 17:20:16

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

代码语言:javascript
运行
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29990684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档