如何加入另一个表的每一行的表?

时间:2013-09-27 13:52:42

标签: sql sql-server sql-server-2008 join left-join

我正在转换一些旧代码以使其更加优化所以我卡在这里我可以通过触发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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

通过查看您的代码,我认为您可以使用row_number()函数获取前1条记录,如下所示{/ 1}};

CTE