1

古いコードを変換してより最適化するので、ここで立ち往生しました。2つのストアドプロシージャを起動することで古い方法で実行できますが、試した結合で可能かどうかを考えていましたが、正しく取得できなかったので、助けてください素晴らしいことだ

私の古いコードとクエリ

dataset = Select data1,data2,data3 from table where column1='somevalue'
//now consider dataset have the records of the above query then 

  foreach (row in dataset)
  {
     Select top 1 tab2data,tab2data from table2 with (nolock) where LtrFileName = row.data1
     //Do some more functionality i can handle this part 
  }

したがって、結合によってこれら2つのクエリを結合しようとしていましたが、左結合で正しく取得できましたがtop 1、結合で適用すると間違った出力が得られることを理解できません。基本的に、これらを取得する方法があるかどうかを尋ねています2 つのクエリを 1 つのストアド プロシージャにまとめ、すべての foreach コーディング部分を回避します。

UPDATE 私が明確でない場合は申し訳ありませんが、ここに最初のクエリからの元の出力があります

 data1      data2    data3   data4
 001000     002142  NBIS1N  20130514
 001000     002142  NBIS1R  20130514
 001000     002142  NBTB1N  20130514
 001000     002142  NBTB1R  20130514

これらはすべての記録です

  tab2data1             tab2data2            data3  tab2data3 
    NULL                NULL                NBIS1N  239
NBIS1R_20100323.pdf 000110-Acct_Rec_Mgmt    NBIS1R  349
NBIS1R_20100324.pdf 000110-Acct_Rec_Mgmt    NBIS1R  349
NBTB1N_20100323.pdf 000110-Acct_Rec_Mgmt    NBTB1N  508
NBTB1N_20100324.pdf 000110-Acct_Rec_Mgmt    NBTB1N  508
 NULL               NULL                    NBTB1R  1360

2番目のクエリを実行した後、次のように4行のみを取得します

 tab2data1             tab2data2            data3  tab2data3 
    NULL                   NULL             NBIS1N  239
NBIS1R_20100324.pdf 000110-Acct_Rec_Mgmt    NBIS1R  349
NBTB1N_20100324.pdf 000110-Acct_Rec_Mgmt    NBTB1N  508
      NULL                  NULL            NBTB1R  1360
4

2 に答える 2

1
SELECT t1.data1, t1.data2, t1.data3, t2.tab2data
FROM dbo.table1 t1 
INNER JOIN dbo.table2 t2
    ON t1.data1 = t2.LtrFileName 
WHERE t1.column1 = 'somevalue'

複数のtable2行があり、1 つだけが必要な場合は、表示する行を指定する必要があります。したがって、を使用しOrder Byます。たとえば、次のようにしROW_NUMBERます。

WITH CTE AS
(
    SELECT t1.data1, t1.data2, t1.data3, t2.tab2data1, t2.tab2data2, t2.tab2data3, 
        RN = ROW_NUMBER() OVER (PARTITION BY t1.data3 ORDER BY t2.tab2data3 ASC)
    FROM dbo.table1 t1 
    INNER JOIN dbo.table2 t2
        ON t1.data3 = t2.data3 
    WHERE t1.data1 = '001000'
)
SELECT data1, data2, data3, tab2data1, tab2data2, tab2data3
FROM CTE
WHERE RN = 1

新しいサンプル データを使用したデモを次に示します: http://sqlfiddle.com/#!3/a032e/8/0

DATA1   DATA2   DATA3   TAB2DATA1            TAB2DATA2                TAB2DATA3
1000    2142    NBIS1N   (null)                (null)                   239
1000    2142    NBIS1R   NBIS1R_20100323.pdf    000110-Acct_Rec_Mgmt    349
1000    2142    NBTB1N   NBTB1N_20100323.pdf    000110-Acct_Rec_Mgmt    508
1000    2142    NBTB1R   (null)                (null)                   1360
于 2013-09-27T14:05:55.953 に答える
0

row_number()コードを見ると、以下のように関数を使用して上位 1 レコードを取得できると思いますCTE

CREATE PROCEDURE yourProcedureName
    -- Add the parameters for the stored procedure here
    @yourParameter Varchar(50)
AS
BEGIN

    ;with cte as (
       Select tab2data,tab2data,..., row_number() over (order by t2.LtrFileName) rn
       from table1 t1 join table2 t2
                 on t1.data1 = t2.LtrFileName
       where t1.column1 = @yourParameter
    )

    Select * 
    From cte
    Where rn = 1
END
于 2013-09-27T14:00:37.547 に答える