繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM