寻找 table 的动态交集

Finding a dynamic intersection of a table

我有一个查询会return一些结果,例如

London      111
London      222
London      333
Manchester  333
Liverpool   111
Liverpool   222
Liverpool   333
Leeds       111
Leeds       222
Leeds       333

我的存储过程采用用户定义的 table,它是一个代码列表,例如 111 和 222,但它可以接受任意数量的代码,具体取决于来自网站的用户输入

考虑到 111 和 333 已通过,我希望 SP 到 return 伦敦、利物浦和利兹(不是曼彻斯特),因为

他们都有这些代码的记录

关于如何实现这一目标的任何线索?

谢谢!

假设您有两个这样的表:

CREATE table towns (town varchar(16), code int);
insert into towns values 
   ('London', 111),('London', 222),
   ('London', 333),('Manchester', 333),
   ('Liverpool', 111),('Liverpool', 222),
   ('Liverpool', 333),('Leeds', 111),
   ('Leeds' ,222),('Leeds',333);

create table codes (ccde int);
insert into codes values (111),(333);

你应该试试

SELECT town, code FROM towns INNER JOIN codes on ccde=code GROUP BY town
HAVING COUNT(*)=(select count(*) from codes)

请查看这个编辑后的版本。我的第一次尝试显然是错误的。

您可以在此处找到演示:http://rextester.com/DCWD90908

编辑

刚刚注意到,如果 towns 中的 town, code 列没有 unique 限制,我的命令会给出错误的结果。如果 towns 中可以有双重记录,例如 'Manchester', 333 出现两次,那么以下仍会提供正确的结果:

SELECT town FROM 
  (SELECT DISTINCT * FROM towns) t 
INNER JOIN codes ON ccde=code GROUP BY town
HAVING COUNT(*)=(SELECT DISTINCT COUNT(*) FROM codes)

http://rextester.com/RZJK41394

将查询结果丢到一个临时的table中,然后像这样重新查询。

您可以进行基本的 SELECT 查询。

SELECT name , code 
FROM [table] AS t1 
INNER JOIN [table] AS t2 
 ON t1.name = t2.name
WHERE t1.code = '111' AND t2.code = '333'

不过,对于较大的数据集,这会变得低效。

另一种方法是使用 ROW_NUMBER()sub-SELECT.

SELECT DISTINCT name FROM ( 
    SELECT name , ROW_NUMBER () OVER (PARTITION BY name ORDER BY code) AS row_count
    FROM [table] AS t1 
    WHERE t1.code IN ('333' , '111')
    GROUP BY t1.name, t1.code ) AS list
WHERE list.row_count > 1