テーブル データの再利用について質問がありますが、渡す必要のあるパラメーターがあるため、このシナリオではビューが機能しません。基本的に、システムのこの部分ではtravellerid
、プロシージャに を送信し、その特定の旅行者のためにアレンジャーが戻ってきました。どのアレンジャーを返すことができるかを決定するために使用される約 7 つのビジネス ルールがあり、それらは相互に排他的であるため、これらのオプションのルールに対応するために、派生クエリ内で一連の UNION を使用しました。これはうまく機能しており、パフォーマンスはかなり大きなデータベース全体で良好に見えますが、システムの約 4 つの他の部分でこれらのルール (UNIONS) を再利用する必要があります。
最初にこれらの UNIONS を使用して VIEW を作成しようとしましたが、各 UNION のロジックが異なり、パラメーター要件が異なるために機能しませんでした。そのため、関数でこの問題を解決できるのではないかと考えていました。ビジネス ルールに基づいて、パラメーター@travellerid
として取り、リストを返す関数を作成した場合、これは理想的で高速なソリューションでしょうか? arrangerid
現在、外部クエリで UNION ALL と DISTINCT を使用しています。これは、データの一意性のために UNION を使用するよりもはるかに高速であることが証明されたためです。
以下のビジネス ルールを使用した現在の手順 (SQL Server 2008):
CREATE PROCEDURE [dbo].[getArrangersForTraveller]
@travellerid int
AS
DECLARE @costcentreid int
DECLARE @departmentid int
-- Shorthand the traveller costcentre and department for use in queries below
SET @costcentreid = (SELECT costcentreid FROM traveller WHERE id = @travellerid)
SET @departmentid = (SELECT departmentid FROM traveller WHERE id = @travellerid)
SELECT DISTINCT t.id, t.firstname, t.lastname, ti.name AS title, dv.preferred
FROM traveller t
INNER JOIN title ti ON t.titleid = ti.id
INNER JOIN
(
-- Get Preferred Arrangers linked to Department Groups
SELECT dg.arrangerid as id
FROM departmentGroup dg
INNER JOIN department_departmentGroup ddg
ON (dg.id = ddg.departmentGroupId AND ddg.departmentid = @departmentid)
UNION ALL
-- Get Preferred Arrangers linked to Cost Centre Groups
SELECT cg.arrangerid as id
FROM costCentreGroup cg
INNER JOIN costcentre_costCentreGroup ccg
ON (cg.id = ccg.costCentreGroupId AND ccg.costcentreid = @costcentreid)
UNION ALL
-- If Cost Centre Group has a linked department and this department matches
-- the travel arrangers department then return these travel arrangers as well
SELECT t3.id
FROM costCentreGroup cg1
INNER JOIN costcentre_costCentreGroup ccg1
ON (cg1.id = ccg1.costCentreGroupId AND ccg1.costcentreid = @costcentreid)
INNER JOIN traveller t3
ON t3.departmentid = cg1.departmentid
WHERE t3.accesslevelid > 1
UNION ALL
-- Get Direct linked travel arrangers
SELECT t1.travelarrangerid as id
FROM travelarranger_traveller t1
WHERE t1.travellerid = @travellerid
UNION ALL
-- Get Cost Centre linked arrangers
SELECT tc.travelarrangerid as id
FROM travelArranger_costcentre tc
WHERE tc.costcentreid = @costcentreid
UNION ALL
-- Get Department linked arrangers
SELECT td.travelarrangerid
FROM travelArranger_department td
WHERE td.departmentid = @departmentid
UNION ALL
-- Get Company flagged arrangers
SELECT t2.id
FROM traveller t2
INNER JOIN company c ON t2.companyid = c.id
WHERE t2.accesslevelid > 1
AND ((c.allowTravelArrangerDepartmentAccess = 1 AND t2.departmentid = @departmentid)
OR (c.allowTravelArrangerCostCentreAccess = 1 AND t2.costcentreid = @costcentreid))
) as dv ON dv.id = t.id
WHERE t.accessLevelid > 1 -- arranger or manager
AND t.isenabled = 1
ORDER BY dv.preferred DESC, t.lastname, t.firstname;