首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表值参数用于筛选每一行的第一次匹配

表值参数用于筛选每一行的第一次匹配
EN

Stack Overflow用户
提问于 2015-11-05 20:13:51
回答 2查看 276关注 0票数 0

我有张桌子看起来像这样:

代码语言:javascript
复制
id1 | id2 | value | id3
1   | abc | 23    | apt-1
1   | abc | 24    | apt-2
2   | def | 25    | apt-3
3   | def | 25    | apt-3

我需要从上面的表中获得与表值参数匹配的第一行,如下所示:

代码语言:javascript
复制
id1 | id2 |
1   | abc |
2   | def |

我希望结果是

代码语言:javascript
复制
id1 | id2 | value | id3
1   | abc | 23    | apt-1
2   | def | 25    | apt-3

相反,我回到了表中的三行。

代码语言:javascript
复制
id1 | id2 | value | id3
1   | abc | 23    | apt-1
1   | abc | 24    | apt-2
2   | def | 25    | apt-3

我该怎么解决这个问题?这样做的效率是多少?这是一个临时的解决方案,当我们写入的数据比目前正在读取的更多,但也将是基于id3的阅读在未来。

让我们调用表Foo和tvp tvpInput。

我尝试了以下两个查询:

代码语言:javascript
复制
--Approach 1
SELECT *
FROM Foo as ret
INNER JOIN @tvpInput t
ON
t.id1 = ret.id1 
AND t.id2 = ret.id2

--Approach 2
SELECT *
FROM Foo AS ret
WHERE EXISTS 
(
    SELECT t.id1, t.id2 FROM @tvpInput t 
    WHERE 
    ret.id1 = t.id1
    AND ret.id2 = t.id2     
)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-05 20:50:12

这里有一个方法你可以这样做。还有其他几种方法也能奏效。

代码语言:javascript
复制
select *
from
(
    SELECT *, ROW_NUMBER() over(partition by ret.id1, ret.id2 order by (select newid())) as RowNum
    FROM Foo as ret
    INNER JOIN @tvpInput t ON t.id1 = ret.id1 
                AND t.id2 = ret.id2
) x
where x.RowNum = 1
票数 0
EN

Stack Overflow用户

发布于 2015-11-05 20:25:18

如果你只想要一行,你可以使用顶部。请记住,SQL表中没有隐含的排序,因此您需要指定ORDER来接收确定的结果。

代码语言:javascript
复制
SELECT TOP 1 f.*
FROM Foo f
INNER JOIN @tvpInput t
ON t.id1 = ret.id1 AND t.id2 = ret.id2
ORDER BY f.id3
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33553931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档