【问题标题】:Avoid picking rows from joined table and use it only to get column value避免从连接表中选择行并仅用于获取列值
【发布时间】:2015-03-17 06:43:09
【问题描述】:

dbo.MatchDate(@Date) :从dbo.Patients 表返回结果的内联 TVF。内联 TVF 返回以下列: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.Patients 表中dbo.MatchDate(@Date) 函数返回的行的ModifiedAt 值是否大于ResultsStored 表中RowId's 中的行的ModifiedAtRowId's 返回的行相同。由于dbo.MatchDate(@Date) 仅返回RowIdPercentMatch,为了获得这些行中的ModifiedAt,我在RowId 列上加入了Patients 表。 然后为了比较起见,为了从ResultsStored 表中获取ModifiedAt,我仅在RowId 列上将dbo.ResultsStored 进一步加入。

问题:它会导致插入重复的行,即我不仅从dbo.MatchDate(@Date) 获取行,而且还从dbo.ResultsStored 表中获取行,这根本不是预期的。 dbo.ResultsStored 只是检查 ModifiedAt 的值是否与 row id's 相同。

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

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    我认为你可以使用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) )
    

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

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      相关资源
      最近更新 更多