我有一个简单的项目表。称它们为“零件”。
每个部分在单独的表中可以有零个或多个相关条目,称为“子部分”。正如您可能期望的那样,表格的简单视图是:
Parts
-----
PartID int (PK)
PartName varchar
SubParts
--------
SubPartID int (PK)
PartID int (FK_Parts)
SubPartName varchar
SubPartAdded datetime
我想从主表中返回所有部分,但也可以访问最新的(按 SubPartAdded DESC 排序)相关的 SubPart(如果存在)。
我的困惑是 subparts 表中有 1M+ 条目(对于许多不同的部分),我只需要当前部分的最新条目(如果存在)。
早些时候,我写了一条语句,在 Parts 表和相关 Subparts 的派生表之间执行左连接(有效),但派生表似乎返回 subparts 表中的所有行,从而导致性能下降。我基本上需要在派生的 select 语句中执行 TOP 1 并按 DESC 排序,以按 PartID(和其他一些列)预过滤子部分。但是,由于我似乎无法在派生的 select 语句中引用 Parts 表(外部)列,因此我无法向派生表添加 WHERE 子句。
我还尝试了以下确实执行但不返回任何相关记录的代码段:
SELECT p.PartName, sp.SubPartName, sp.SubPartAdded
FROM Parts p
LEFT JOIN (SELECT TOP 1 SubPartID, SubpartAdded, PartID FROM SubParts ORDER BY SubPartAdded) AS sp
ON sp.PartID = p.PartID
我想“TOP 1”语句正在对整个 SubParts 表执行,然后被“ON”语句过滤(?)
最终,我需要在主存储过程中的多个位置使用 Subparts 表中的一些列,所以我不只是想要一个相关的子查询,因为这需要多次调用。
(此过程将在每次执行时返回多个部分。即,该过程不会被单个 PartID 过滤)
我希望这很清楚?听起来它应该有一个非常简单的解决方案,但我现在很难过!(需要兼容 SQL Server 2K 及以上版本)
问候尼克