如果问题不是那么清楚,我道歉,但是在一个像标题一样短的空间里,这是一个相对难的词。
想象一下,你有一张表格如下:
+----+---------+----------------+
| 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 ||运行单独的查询英国
答案 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');