【发布时间】:2021-06-06 19:08:30
【问题描述】:
如何使用CROSS APPLY(或INNER JOIN)根据其他表中的值从一个表中获取数据?
即我有以下表格:
表格说明:
| ProdID | Description | TrackNum |
|---|---|---|
| 361 | Test 1 | 499 |
| 388 | Test 2 | 003 |
| 004 | 5599 | |
| 238 | Test 3 | 499 |
| 361 | Test 10 | 555 |
| 004 | Test 40 | 555 |
餐桌产品:
| ProdID | ProductName | Price |
|---|---|---|
| 361 | P1 | 5.00 |
| 388 | P2 | 5.00 |
| 004 | P3 | 12.00 |
| 238 | P4 | 6.00 |
| 515 | P5 | 7.00 |
| 636 | P6 | 7.00 |
| 775 | P7 | 7.00 |
| 858 | P8 | 8.00 |
表格发票:
| ProdID | TrackNum | InvoiceID |
|---|---|---|
| 361 | 499 | 718 |
| 388 | 199 | 718 |
| 004 | 499 | 718 |
| 238 | 499 | 718 |
| 361 | 555 | 333 |
| 004 | 555 | 444 |
| 361 | 111 | 444 |
| 388 | 222 | 333 |
| 616 | 116 | 565 |
| 717 | 116 | 565 |
| 361 | 003 | 221 |
| 388 | 003 | 221 |
| 004 | 5599 | 728 |
我需要我的查询做的是:
- 先进入 Invoices 表,只获取与指定 InvoiceID 和 TrackNum 匹配的记录;
- 然后进入 Products 表并获取 only 行在 ProdID 我在第 1 步中提取的数据与数据存在于 Products 表中。
- 然后最终从 Descriptions 表中获取所有列,但仅针对我在第 2 步中获得且与 ProdID 匹配的行。
我最后需要的是这样的(如果我得到更多的列,那很好,但我不想得到更多的行):
| ProdID | Description | TrackNum |
|---|---|---|
| 361 | Test 1 | 499 |
| 004 | 5599 | |
| 238 | Test 3 | 499 |
我有以下查询(我曾尝试使用 INNER JOIN 和 CROSS APPLY) - 但它返回的行数超出了我的需要:
SELECT * FROM [Descriptions] AS [DES]
CROSS APPLY
(
select * from [Invoices] AS [INV] where [INV].[TrackNum] = '499' AND [INV].[InvoiceID] = '718'
) [INV]
CROSS APPLY
(
select * from [Products] AS [GP]
WHERE [GP].[ProdID] = [INV].[ProdID]
) [GP2]
WHERE
[DES].[ProdID] = [GP2].[ProdID]
order by [DES].[ProdID] asc
【问题讨论】:
-
您在任何地方都没有条件,说明哪个描述记录与哪个发票记录相关联。因此,您将找到的所有发票应用于每一个描述。
-
这可能会有所帮助...stackoverflow.com/questions/1139160/…
-
看起来您可以使用where exists 代替加入或交叉应用
标签: sql sql-server performance inner-join cross-apply