如何根据子 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;
如果您想将所有内容都放在一个结果集中,请将 ItemCode
和 Warehouse
添加到查询中,并省略 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
考虑下表,对于每个至少有 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;
如果您想将所有内容都放在一个结果集中,请将 ItemCode
和 Warehouse
添加到查询中,并省略 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