同じテーブルからいくつかの値を変換(ルックアップ)する必要がある場合があります。私が最初に書いた方法は、サブクエリを使用することでした。
SELECT
(SELECT id FROM user WHERE user_pk = created_by) AS creator,
(SELECT id FROM user WHERE user_pk = updated_by) AS updater,
(SELECT id FROM user WHERE user_pk = owned_by) AS owner,
[name]
FROM asset
私はこのサブクエリを頻繁に使用しているので(つまり、これらのフィールドを持つテーブルが約50あります)、サブクエリにさらにコードを追加する必要があるかもしれません(たとえば、「AND active = 1」)。 dこれらをユーザー定義関数UDFに入れて、それを使用します。しかし、そのUDFを使用したパフォーマンスはひどいものでした。
CREATE FUNCTION dbo.get_user ( @user_pk INT )
RETURNS INT
AS BEGIN
RETURN ( SELECT id
FROM ice.dbo.[user]
WHERE user_pk = @user_pk )
END
SELECT dbo.get_user(created_by) as creator, [name]
FROM asset
#1のパフォーマンスは1秒未満です。#2のパフォーマンスは約30秒です...
なぜ、またはもっと重要なことに、SQL Server 2008でコーディングできる方法があるので、それほど多くのサブクエリを使用する必要はありませんか?
編集:
これがいつ役立つかについてのもう少しの説明。この単純なクエリ(つまり、ユーザーIDの取得)は、ユーザーのテキストが必要な場合、言語を取得するためにプロファイルに参加し、言語をフェッチする必要があるかどうかを会社に確認する必要があるため、はるかに複雑になります。代わりにそこから編集し、翻訳されたテキストを取得するために翻訳テーブルを使用します。そして、これらのクエリのほとんどでは、パフォーマンスは読みやすさと保守性の二次的な問題です。