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