我有以下模式的表:
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函数执行此操作但未成功。
由于
答案 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