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 
  }

所以我试图通过连接来组合这两个查询,我用左连接得到了正确的结果,但我无法弄清楚top 1如果将它与连接一起应用它会给出错误的输出。所以基本上我在问有没有办法得到这些两个查询合并为一个存储过程,避免了所有的 foreach 编码部分。

更新 对不起,如果我不清楚,但这是它给出的第一个查询的原始输出

 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

现在在执行第二个查询后,我得到的只有四行,如下所示

 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行并且只想要一个,则必须指定要查看的行。因此使用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 回答