2015-03-02 48 views
0

我有以下模式中的表:從多個表中返回數據的SQL查詢?

items (itemID: integer, description: string, price: integer) 
orders (orderID: integer, itemID: integer, aID: integer, customerID: integer, date: date) 

我想找出其中有隻有一個訂單的每個項目,返回ITEMID,描述和訂單的日期。

我有下面的代碼至今:

SELECT * 
FROM (
SELECT * 
FROM orders 
GROUP BY itemID 
HAVING COUNT(*) = 1 
) AS ONLY_ONCE 

但這僅返回我的代碼搜索項目的訂單表(單編號,ITEMID,援助和CustomerId) 信息,其itemID只在訂單表中出現一次,這意味着它只被訂購一次。 如何獲取項目表中這些項目的描述? 我嘗試使用連接功能來做到這一點,但沒有成功。

感謝

回答

2

你非常接近加入你的 '組' 表結果...試試這個:

SELECT * 
FROM items 
WHERE itemID IN (
    SELECT itemID 
    FROM orders 
    GROUP BY itemID 
    HAVING COUNT(*) = 1 
) 

如果您還想要結果集中的訂單日期,有很多方法可以做到這一點,但我會選擇CTE和IN運算符的內部連接,如下所示:

;WITH SingleOrders AS (
    SELECT itemID, MAX([date]) AS [Date] 
    FROM orders 
    GROUP BY itemID 
    HAVING COUNT(*) = 1 
) SELECT * 
    FROM items i 
     INNER JOIN SingleOrders so ON i.itemID = so.itemID 

第一部分聲明瞭一個名爲「SingleOrders」的公用表表達式,它由兩列構成:每個itemID的ID和日期只有一個訂單。 MAX(日期)返回唯一的日期,並且因爲GROUP BY子句而被需要。

然後,實際的SELECT語句將此CTE與items表連接起來,以僅選擇只有一個訂單的itemID,並且由於它包括來自這兩個項目和SingleOrders表中的所有列,將包含日期。

如果你不想使用CTE(或不能使用一個),這樣的東西可能適合你...只需添加一個內部連接返回到訂單表來選擇日期:

SELECT i.*, o.date 
FROM items i 
    INNER JOIN orders o ON i.itemID = o.itemID 
WHERE i.itemID IN (
    SELECT itemID 
    FROM orders 
    GROUP BY itemID 
    HAVING COUNT(*) = 1 
) 
+0

謝謝!它工作得很好,但我怎麼也從訂單表中添加日期? @pmbAustin – mar 2015-03-02 17:31:32

+0

我已經更新了有關如何從訂單表中獲取日期的信息。同樣的邏輯將擴展到獲得其他列。 – pmbAustin 2015-03-02 17:44:13

+0

謝謝!您編輯的引用通過錯誤返回錯誤:SQLSTATE [42000]:語法錯誤或訪問衝突:1064您的SQL語法中有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在第1行的WITH'SingleOrders AS(SELECT itemID,MAX([date])AS [Date] FROM orde'附近使用正確的語法 – mar 2015-03-02 19:09:50

1

您需要與原始數據

SELECT I.* 
FROM items I 
INNER JOIN(
    SELECT itemID 
    FROM orders 
    GROUP BY itemID HAVING COUNT(1)=1 
    ) O ON O.itemID=I.itemID