2017-02-22 52 views
0

我正在寻找在T-SQL实现这一点(的SQL Server 2014)查找另一个表匹配任何元素

的有效方式,我有这样一个静态的基本元素表变量的第一个记录:

╔════╦═════════════╗ 
║ Id ║ Hashtag ║ 
╠════╬═════════════╣ 
║ 1 ║ Thailand ║ 
║ 2 ║ Philippines ║ 
║ 3 ║ Indonesia ║ 
║ 4 ║ Brazil  ║ 
║ 5 ║ Mexico  ║ 
║ 6 ║ Nicaragua ║ 
║ 7 ║ Colombia ║ 
║ 8 ║ Malaysia ║ 
╚════╩═════════════╝ 

而且我也有另外一个表变量(动态填入查询)是这样的:

╔════╦══════════╗ 
║ Id ║ Hashtag ║ 
╠════╬══════════╣ 
║ 1 ║ Live  ║ 
║ 2 ║ Brazil ║ 
║ 3 ║ Like  ║ 
║ 4 ║ Thailand ║ 
║ 5 ║ Malaysia ║ 
║ 6 ║ Love  ║ 
╚════╩══════════╝ 

我需要做的是遍历第二个表,并为每个记录看如果它存在于基表中并且它发现第一次匹配时停止迭代并返回找到的值,那么在我的示例中,查询应该返回“Brazil”,因为它是第一个记录,其降序也包含在基表中。

我目前正在使用快速转发光标与第二个表格元素并查询第一张表以查找匹配,它的工作原理,但我不是T-SQL的专家,所以我要求您的帮助了解是否有更有效的方法。

+0

那么你的输出是单一的记录,即巴西?或者你期望得到一张桌子? –

+0

@ shree.pat18只是字符串值“Brazil”(VARCHAR变量) –

回答

2

假设你想找到一个记录这是第一场比赛,你可以做这样的事情:

select hashtag 
from dynamictable 
where id = (
      select min(d.id) 
      from dynamictable d 
      inner join referencetable r on r.hashtag = v.hashtag 
      ) 

内部联接仅返回其中包括hashtag两个表中存在的记录。然后,我们只需从动态表中选择最小ID并获取相应的哈希标签作为输出。

事实上,这可以进一步简化使用单个连接如下:

select top 1 d.hashtag 
from dynamictable d 
inner join referencetable r on r.hashtag = d.hashtag 
order by v.id 
+1

使用'TOP'是在这里去IMO的路。 –

+0

@ shree.pat18我用了第二个版本,非常感谢! –

1

作为替代斯里的回答中,我们可以用行号这里确定的第一个匹配记录所订购的Id:

WITH cte AS(
    SELECT t2.Hashtag, 
      ROW_NUMBER() OVER (PARTITION BY Id ORDER BY Id) rn 
    FROM table2 t2 
    INNER JOIN table1 t1 
     ON t2.Hashtag = t1.Hashtag 
) 
SELECT t.Hashtag 
FROM cte 
WHERE t.rn = 1 
相关问题