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
)
我有 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
)