mhd.sbt Ответов: 1

Есть ли способ, чтобы удалить лоне присоединиться к лучшей производительности ? Я хочу получить поле cardno после среднего соединения ,


SELECT Top 1  details.PersonnelBaseID FROM dbo.tkp_PersonnelDetails INNER JOIN
(
	SELECT 
		personnelDetails.EffectiveDate,personnelDetails.PersonnelBaseID,CardNo 
	FROM 
		dbo.tkp_PersonnelDetails AS personnelDetails 
	INNER JOIN
	(
		SELECT  
				Max(EffectiveDate) AS EffectiveDate,details.PersonnelBaseID
		FROM            
			dbo.tkp_PersonnelDetails AS details INNER JOIN
			prs_Personnel personnel ON personnel.ID = details.PersonnelBaseID AND 
			Personnel.Active = 1 AND 
			Personnel.Deleted = 0 AND
			details.Deleted = 0 AND 
			details.EffectiveDate <= @Time
		GROUP BY PersonnelBaseID
	)result ON result.PersonnelBaseID = personnelDetails.PersonnelBaseId AND result.EffectiveDate = personnelDetails.EffectiveDate
)details ON tkp_PersonnelDetails.PersonnelBaseID = details.PersonnelBaseId AND tkp_PersonnelDetails.cardNo = @CardNo
ORDER BY tkp_PersonnelDetails.Effectivedate DESC 


Что я уже пробовал:

есть ли способ, чтобы удалить лоне присоединиться к лучшей производительности ? я хочу получить поле CardNo после присоединения

1 Ответов

Рейтинг:
1

Wendelius

Учитывая, что логика не должна меняться, вы можете вносить различные изменения в оператор, но вы не можете полностью удалить соединение, так как это повлияет на результаты.

Например, одним из вариантов может быть

WITH r1 (
   SELECT  Max(EffectiveDate) AS EffectiveDate,details.PersonnelBaseID
   FROM dbo.tkp_PersonnelDetails AS details INNER JOIN
	prs_Personnel personnel ON personnel.ID = details.PersonnelBaseID AND 
	Personnel.Active = 1 AND 
	Personnel.Deleted = 0 AND
	details.Deleted = 0 AND 
	details.EffectiveDate <= @Time
   GROUP BY PersonnelBaseID
)
SELECT Top 1  details.PersonnelBaseID FROM dbo.tkp_PersonnelDetails INNER JOIN
(
	SELECT personnelDetails.EffectiveDate,personnelDetails.PersonnelBaseID,CardNo 
	FROM dbo.tkp_PersonnelDetails AS personnelDetails 
	INNER JOIN r1 ON r1.PersonnelBaseID = personnelDetails.PersonnelBaseId 
                      AND r1.EffectiveDate = personnelDetails.EffectiveDate
) details ON tkp_PersonnelDetails.PersonnelBaseID = details.PersonnelBaseId 
          AND tkp_PersonnelDetails.cardNo = @CardNo
ORDER BY tkp_PersonnelDetails.Effectivedate DESC 

Другим вариантом может быть использование структуры EXISTS.

Но что касается производительности, то первое, что нужно сделать, это проверить, есть ли у вас все необходимые индексы на месте. Например что-то вроде:
- Таблица prs_Personnel столбцы Id, активные, удаленные
- Таблица tkp_personneldetails столбцы PersonnelBaseID, Deleted, EffectiveDate