2015-05-01 63 views
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'); 

讓我們假設約翰和簡的身份證號碼分別爲1和2,鴨和蛋糕的身份證號碼分別爲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); 

,我想要做的就是運行兩種類型的查詢:

  1. 誰同時擁有一隻鴨子和蛋糕的客戶選擇名稱(應返回「簡」只) 。
  2. 選擇有鴨子的顧客的名字並且沒有蛋糕(只能返回'John')。
+1

參見:http://stackoverflow.com/questions/29012455/find-the-sids-of-the -suppliers - 誰 - 供應 - 每部/ 29013311#29013311。這個問題有很多的演練,因爲它的一些版本通常是解釋查詢的例子。一旦你掌握了第一個問題的答案,那麼修改它以回答你的第二個問題應該很容易。 –

+0

如果你試圖自己想象,它會對你的學習更有趣和更好。您可以使用EXISTS或JOIN。 –

回答

1

對於列出的兩種類型的查詢,可以使用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

+0

如果你想要多個包含/排除項目,你需要爲每個項目創建一個單獨的EXISTS/NOT EXISTS子句,對嗎? – user1205255

+0

是的,如果你想檢查一個特定的名字,那麼你需要一個單獨的exists/not exists子句 –

相關問題