寻找 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)
将查询结果丢到一个临时的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
我有一个查询会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)
将查询结果丢到一个临时的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