如何根据子 table 中的值 select 父 table 中的行

How to select rows in parent table based on a value in child table

考虑下表,对于每个至少有 1 个带有特定仓库代码的子行的订单,return 1 行的有效查询是什么?我正在使用 SQL Server 2016。

Table: Orders
OrderNo OrderDt    Status Type
------- ---------- ------ --------
200123  11/20/2020 NEW    SHIPPING
200124  11/21/2020 NEW    IN-STORE
200125  11/21/2020 NEW    SHIPPING
Table: OrderItems
OrderNo ItemCode Warehouse
------- -------- ---------
200123  Item1    10
200124  Item1    10
200124  Item2    20
200125  Item2    20

如果我查询仓库 10:

OrderNo OrderDt    Status Type
------- ---------- ------ --------
200123 11/20/2020  NEW    SHIPPING
200124 11/21/2020  NEW    IN-STORE

如果我查询仓库 20:

OrderNo OrderDt    Status Type
------- ---------- ------ --------
200124  11/21/2020 NEW    IN-STORE
200125  11/21/2020 NEW    SHIPPING

假设当您说“当我查询仓库 X 时”时,您是 运行 对单个仓库的单独查询,只需一个简单的 INNER JOIN 和一个 WHERE 子句即可它:

SELECT DISTINCT o.OrderNo, o.OrderDt, o.Status, o.Type
FROM Orders o
INNER JOIN OrderItems oi ON o.OrderNo = oi.OrderNo
WHERE Warehouse = 10;

SELECT DISTINCT o.OrderNo, o.OrderDt, o.Status, o.Type
FROM Orders o
INNER JOIN OrderItems oi ON o.OrderNo = oi.OrderNo
WHERE Warehouse = 20;

如果您想将所有内容都放在一个结果集中,请将 ItemCodeWarehouse 添加到查询中,并省略 WHERE 子句。

SELECT
    o.OrderNo,
    o.OrderDt,
    o.Status,
    o.Type,
    oi.ItemCode,
    oi.Warehouse
FROM Orders o
INNER JOIN OrderItems oi ON o.OrderNo = oi.OrderNo;

您可以使用 exists:

select o.*
from orders o
where exists (
    select 1 
    from orderitems oi 
    where oi.orderno = o.orderno and oi.warehouse = 10
)

为了提高此查询的性能,请考虑 orderitems(orderno, warehouse) 上的索引。

您可以使用下面的查询,我们在加入表之前过滤掉仓库:

select distinct o.orderNo, o.OrderDt, o.Status, o.Type from orders o, (select orderNo, Warehouse from orderitems 
where warehouse = ##) o1
on o1.orderNo = o.orderNo