SQL查询从多个表返回数据?

时间:2015-03-02 16:35:20

标签: mysql sql-server join subquery

我有以下模式的表:

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

我想找出每个只有一个订单的商品,返回商品ID,说明和订单日期。

到目前为止,我有以下代码:

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

但是这只返回订单表中的信息(orderID,itemID,aID和customerID) 在我的代码中,我搜索itemID在orders表中只出现一次的项目,这意味着它只订购了一次。 如何获取项目表中这些项目的描述? 我尝试使用join函数执行此操作但未成功。

由于

2 个答案:

答案 0 :(得分: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和Date。 MAX(date)返回唯一的日期,由于GROUP BY子句而是必需的。

然后,实际的SELECT语句将此CTE与items表连接,以仅选择只有一个订单的itemID,并且由于它包含来自items和SingleOrders表的所有列,因此将包含日期。

如果您不想使用CTE(或者不能使用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
) 

答案 1 :(得分: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