ストアドプロシージャをSQLクエリに変換したい。
簡単な形式のストアドプロシージャは次のとおりです。
SELECT
table1.*
INTO
#raw_data
FROM
table_1 WITH (NOLOCK)
WHERE
(a lot of conditions and filtering follows)
SELECT
xyz,
pqr,
(SELECT (something)
FROM #raw_data aa
WHERE aa.id1 = a.id1
AND aa.id2 = a.id2
...)
INTO
#temp_data
FROM
#raw_data a
JOIN
table_2 b WITH (NOLOCK) ON a.xid = b.xid
このストアドプロシージャをSQLクエリに変換するに#raw_data
は、2番目のSELECT
ステートメントのすべてを次のように置き換えることができますか?
SELECT table1.*
FROM table_1 WITH (NOLOCK)
WHERE (a lot of conditions and filtering follows)
もっと良い方法があるかどうか知りたいのですが。
だからあなたはそれを...
SELECT xyz
, pqr
, (
SELECT (something)
FROM (
SELECT table_1.*
FROM table_1 WITH (NOLOCK)
WHERE (a lot of conditions and filtering follows)
) aa
WHERE aa.id1 = a.id1
AND aa.id2 = a.id2
...
)
INTO #temp_data
FROM (
SELECT table_1.*
FROM table_1 WITH (NOLOCK)
WHERE (a lot of conditions and filtering follows)
) a
inner JOIN table_2 b WITH (NOLOCK) ON a.xid = b.xid
しかし、あなたは続けるべきです。この場合、相関サブクエリは必要ありません。付加価値はないようです。クエリがより複雑になります。また、サブクエリは外部クエリのすべての行に対して1回実行する必要があるため、速度が低下します。データセットをまとめて結合するSQLServerの機能を利用するには...
SELECT xyz
, pqr
, aa.something
INTO #temp_data
FROM (
SELECT table_1.*
FROM table_1 WITH (NOLOCK)
WHERE (a lot of conditions and filtering follows)
) a
inner join (
SELECT table_1.*
FROM table_1 WITH (NOLOCK)
WHERE (a lot of conditions and filtering follows)
) aa on aa.id1 = a.id1
and aa.id2 = a.id2
...
inner JOIN table_2 b WITH (NOLOCK) ON a.xid = b.xid
コードのように、結合の両側で同じ列を使用してtable_1をtable_1に常に結合していると仮定すると、さらに単純化できる可能性があります。ここでは注意してください。xidは一意であるか、a
との間の結合に含まれていると思いますaa
。そうでない場合は、ここで停止することをお勧めします。
したがって、さらに単純化できる場合、次のステップは...
SELECT xyz
, pqr
, a.something
INTO #temp_data
FROM (
SELECT table_1.*
FROM table_1 WITH (NOLOCK)
WHERE (a lot of conditions and filtering follows)
) a
inner JOIN table_2 b WITH (NOLOCK) ON a.xid = b.xid
...そして次のように簡略化できます...
SELECT xyz
, pqr
, a.something
INTO #temp_data
FROM table_1 a WITH (NOLOCK)
inner JOIN table_2 b WITH (NOLOCK) ON a.xid = b.xid
WHERE (a lot of conditions and filtering follows)
あなたが共有しなかったよりもかなり複雑なものがあるようです(不確実性の3つの点)。
WHERE aa.id1 = a.id1
AND aa.id2 = a.id2
...
あなたのマイレージは異なる場合があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加