避免从加入的 table 中选取行并仅将其用于获取列值

Avoid picking rows from joined table and use it only to get column value

dbo.MatchDate(@Date) :returns 来自 dbo.Patients table 的内联 TVF。内联 TVF returns 这些列:RowIdPercentmatch .

到目前为止我有这个查询:

INSERT INTO #Temp2 (RowNumber,ValFromFunc,FuncWeight,percentage)
SELECT RowNumber, d.PercentMatch, @constVal, d.PercentMatch * @constVal
from dbo.MatchDate(@Date) d inner join dbo.Patients p 
on d.RowNumber = p.RowId 
inner join dbo.ResultsStored rs on rs.RowId = d.RowNumber 
where p.ModifiedAt > rs.ModifiedAt

我需要检查 dbo.MatchDate(@Date) 函数从 dbo.Patients table 返回的行的 ModifiedAt 值是否大于 ModifiedAt 中行的 ModifiedAt 20=] table 和 RowId'sdbo.MatchDate(@Date) 返回的相同。由于 dbo.MatchDate(@Date) returns 只有 RowIdPercentMatch,为了获得这些行中的 ModifiedAt,我在 [=] 上加入了 Patients table 14=] 列。 然后为了比较起见,为了从 ResultsStored table 得到 ModifiedAt,我在 RowId 列上进一步加入了 dbo.ResultsStored

问题: 它导致插入重复的行,即我不仅从 dbo.MatchDate(@Date) 获取行,而且从 dbo.ResultsStored table 获取行根本不是故意的。 dbo.ResultsStored 只是为了检查相同 row id's.

ModifiedAt

由于 dbo.ResultsStored table,我如何修改上述查询以避免 #Temp2 中的行重复?

我想你可以使用 EXISTS 来检查你想要的:

INSERT INTO #Temp2 (RowNumber,ValFromFunc,FuncWeight,percentage)
SELECT RowNumber, d.PercentMatch, @constVal, d.PercentMatch * @constVal
FROM dbo.MatchDate(@Date) AS d
WHERE EXISTS (
   SELECT 1 
   FROM dbo.Patients AS p 
   INNER JOIN dbo.ResultsStored AS rs ON rs.RowId = d.RowNumber 
   WHERE (d.RowNumber = p.RowId) AND (p.ModifiedAt > rs.ModifiedAt) )

这将仅插入 #Temp2 来自 TVF 的记录,前提是有 至少一个 记录,具有相同的 RowId,来自 dbo.PatientsModifiedAt 大于来自 dbo.ResultsStored.

的相应记录的 ModifiedAt