SQL 从多个表中查询 return 数据?

SQL query to return data from multiple tables?

我有 table 具有以下架构:

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

我想找出只有一个订单的每件商品,return商品 ID、描述和订单日期。

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

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

但这 return 仅来自订单 table 的信息(orderID、itemID、aID 和 customerID) 在我的代码中,我搜索 itemID 在订单 table 中只出现一次的商品,这意味着它只被订购了一次。 如何获取项目 table 中的这些项目的描述? 我尝试使用 join 函数来执行此操作但没有成功。

谢谢

您需要将 'group' table 结果与原始数据合并

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

你非常接近...试试这个:

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" 的通用 table 表达式,它由两列组成:每个只有一个订单的 itemID 的 ID 和日期。 MAX(date) returns 唯一的日期,并且由于 GROUP BY 子句而需要。

然后,实际的 SELECT 语句将此 CTE 与项目 table 连接到 select,仅列出只有一个订单的 itemID,因为它包括来自两个订单的所有列项目和 SingleOrders tables,将包括日期。

如果您不想使用 CTE(或不能使用 CTE),这样的方法可能适合您...只需将内部连接添加回订单 table 即可选择更新日期:

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
)