[英]SQL query to return data from multiple tables?
我有具有以下模式的表:
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
但是,这仅返回我的代码中订单表中的信息(orderID,itemID,aID和customerID),我在订单表中搜索针对其itemID仅出现一次的商品,这意味着该商品仅被订购了一次。 如何获得项目表中这些项目的描述? 我尝试使用join函数执行此操作,但未成功。
谢谢
您距离很近...试试这个:
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,并且由于它包括item和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
)
您需要将“组”表结果与原始数据结合在一起
SELECT I.*
FROM items I
INNER JOIN(
SELECT itemID
FROM orders
GROUP BY itemID HAVING COUNT(1)=1
) O ON O.itemID=I.itemID
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.