SQL Server:根据查询中收集的值选择行

时间:2016-04-29 10:10:00

标签: sql sql-server

如果问题不是那么清楚,我道歉,但是在一个像标题一样短的空间里,这是一个相对难的词。

想象一下,你有一张表格如下:

+----+---------+----------------+
| 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 ||运行单独的查询英国

3 个答案:

答案 0 :(得分:3)

简单解决方案,EXISTS

select *
from tablename t1
where exists (select 1 from tablename t2
              where t2.Country = t1.Country
                and t2.Name = 'James')

或者,做一个自我JOIN

select t1.*
from tablename t1
  join (select distinct Country from tablename where Name = 'James') t2
  on t2.Country = t1.Country

答案 1 :(得分:1)

{{1}}

答案 2 :(得分:1)

我能想到的最简单的查询是带有IN子句的查询:

select *
from mytable
where country in (select country from mytable where name = 'James');