2016-03-22 15 views
0

私はSQLクエリに慣れていませんが、スピードアップと単純化のために、コードレベルで行っている複数のクエリを移動してサーバーに結合したいと考えています。現在のところ、これは5-10項目だけでも数秒かかる。SQLクエリの簡素化 - SQL Serverでのコードの実行方法

私はビューとテーブルを持っていますが、それらをView1、Table1と呼びましょう。

私の最初のクエリ:これは私が通過ルーピングてるリストを(すべての項目がユニークUnitSerialNumberである)、返し

SELECT UnitSerialNumber 
FROM Table1 
WHERE OrderID = 1234 
    AND IsActive = 1 
ORDER BY SerialNumberDate, IsPrinted 

...

BEGINNING OF LOOP

SELECT ResultId 
FROM View1 
WHERE Data = UnitSerialNumber 
    AND ItemId = 338 
    AND StatusId = 2 

これをクエリで使用している単一の値(ResultId)を返します。

SELECT Data 
FROM View1 
WHERE ID = ResultId 
    AND (ItemId = 311 OR ItemId = 313) 
    AND StatusId = 2 
ORDER BY ItemId 

(私は、このテーブル構造が駄目だと知っていますが、私はそれを何かすることができません。これがデータの格納方法です)。これは2つの値を持つオブジェクトを返します。

END OF LOOP

+1

これはどのように2つの値を返しますか?私はただ一つしか見ない。また、サンプルデータと希望の結果が得られれば、あなたのロジックははるかに簡単になるでしょう。 –

+0

5-10個ですか?さて、実際にはどの部分が項目のパラメータですか? –

+0

は、あなたがこの行うことができます:表1のT1からt1.UnitSerialNumber、v1.ResultId、v2.Data を選択し、内側 がt1.UnitSerialNumberにView1をV1 に参加= v1.Data インナー参加View1をv2の 上v2.ID = v1.ResultId ここt1.OrderID = 1234 AND t1.IsActive = 1 AND v1.ItemId = 338 AND v1.StatusId = 2 AND v2.ItemIdin(311,313) AND v2.StatusId v2.itemidによる= 2 ため –

答えて

0

私はこれが私のために働いている、サブクエリとの試みを与えています。助けようとしてくれてありがとう!

SELECT View1.Data, View1.ItemId, z.SerialNumberDate, z.IsPrinted 
    FROM View1 
    JOIN 
    (
      SELECT View1.Id, x.SerialNumberDate, x.IsPrinted 
      FROM View1 
      JOIN 
      (
        SELECT UnitSerialNumber, SerialNumberDate, IsPrinted 
        FROM Table1 
        WHERE OrderID = 613 AND IsActive = 1 
      ) 
      AS x ON View1.Data = x.UnitSerialNumber 
    ) 
    AS z ON View1.DataCardId = z.Id 
    WHERE View1.ItemId = 313 AND z.IsPrinted IS NULL 
    ORDER BY z.IsPrinted,z.SerialNumberDate 
0

のCTEは、このようなクエリを結合するための簡単な方法です:

with q1 as (
     SELECT UnitSerialNumber, SerialNumberDate, IsPrinted 
     FROM Table1 
     WHERE OrderID = 1234 AND IsActive = 1 
    ), 
    q2 as (
     SELECT ResultId, SerialNumberDate, IsPrinted 
     FROM View1 
     WHERE ItemId = 338 AND StatusId = 2 AND 
      Data in (SELECT UnitSerialNumber FROM q1) 
    ) 
SELECT q2.ResultId, v.Data 
FROM q2 JOIN 
    View1 v 
    ON v.ID = q2.ResultId 
WHERE v.itemId IN (311, 313) AND v.StatusId = 2 
ORDER BY a2.SerialNumberDate, q2.IsPrinted, v.ItemId; 
+0

助けてくれてありがとう、残念ながら、これは何の結果も返しません。 @Steven。 – Steven

+0

。 。それは奇妙に思える。 2つのCTEが行を返すかどうかを判断できますか。 –

+0

Q1は単独で問題ありません。 Q2はSerialNumberDateとIsPrintedを持たず、Data = 'xxxx'に置き換えても正常に動作します。私は部分的に注文を無効にし、全体を実行し、結果は返されません:/ – Steven

0
SELECT 
    v1.Data 
FROM 
    View1 v1 
JOIN 
    View1 v2 
     ON v1.ID = v2.ResultId 
JOIN 
    Table1 t 
     ON v2.Data = t.UnitSerialNumber 
WHERE 
    (v1.ItemId = 311 OR v1.ItemId = 313) 
    AND v1.StatusId = 2 
    AND v2.ItemId = 338 
    AND v2.StatusId = 2 
    AND t.OrderID = 1234 
    AND t.IsActive = 1 
ORDER BY 
    v1.ItemId; 
+0

助けてくれてありがとう、残念なことにこれは何の結果も返しません。 – Steven

関連する問題