SQL Server:根据查询中收集的值选择行
如果问题不是很清楚,我很抱歉,但是在像标题这样短的空间里,这是一个相对难以表达的问题 假设您有一张如下所示的表格:SQL Server:根据查询中收集的值选择行,sql,sql-server,Sql,Sql Server,如果问题不是很清楚,我很抱歉,但是在像标题这样短的空间里,这是一个相对难以表达的问题 假设您有一张如下所示的表格: +----+---------+----------------+ | ID | Name | Country | +----+---------+----------------+ | 1 | James | Mexico | | 2 | Peter | South Africa | | 3 | Paul | Mexic
+----+---------+----------------+
| ID | Name | Country |
+----+---------+----------------+
| 1 | James | Mexico |
| 2 | Peter | South Africa |
| 3 | Paul | Mexico |
| 4 | Colonel | Panama |
| 5 | James | United Kingdom |
| 6 | Hannah | United Kingdom |
+----+---------+----------------+
我想做的是运行一个查询,说抓到任何一个叫詹姆斯的人,以及任何一个和詹姆斯住在同一个国家的人。在这种情况下,它将返回:
+----+--------+----------------+
| ID | Name | Country |
+----+--------+----------------+
| 1 | James | Mexico |
| 3 | Paul | Mexico |
| 5 | James | United Kingdom |
| 6 | Hannah | United Kingdom |
+----+--------+----------------+
虽然这个例子看起来有点荒谬,但它当然是基于一个真实的问题,只是一种简化
事实上,很像这张表(虽然分配的规则没有明确说明这一点),在詹姆斯的国家里,总会有一个“詹姆斯”在其他人之前——例如,在这张表中,从墨西哥交换詹姆斯总是在墨西哥交换保罗之前
事实上,在大多数情况下,来自墨西哥的保罗将直接接替来自墨西哥的詹姆斯,尽管这并不能保证
那么什么样的语法可以让我执行这样的查询呢?唯一可行的方法是返回James(es?)的列表,然后使用WHERE country=mexico | | ukin简单解决方案,
EXISTS
运行单独的查询:
select *
from tablename t1
where exists (select 1 from tablename t2
where t2.Country = t1.Country
and t2.Name = 'James')
或者,进行自连接
:
select t1.*
from tablename t1
join (select distinct Country from tablename where Name = 'James') t2
on t2.Country = t1.Country
简单的解决方案,
存在
:
select *
from tablename t1
where exists (select 1 from tablename t2
where t2.Country = t1.Country
and t2.Name = 'James')
或者,进行自连接
:
select t1.*
from tablename t1
join (select distinct Country from tablename where Name = 'James') t2
on t2.Country = t1.Country
这里我能想到的最简单的查询是在子句中使用
的查询:
select *
from mytable
where country in (select country from mytable where name = 'James');
这里我能想到的最简单的查询是在
子句中使用的查询:
select *
from mytable
where country in (select country from mytable where name = 'James');