2016-04-29 53 views
1

如果問題不是很清楚,我表示歉意,但是在標題空格內拼寫相對較困難。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 | 
+----+--------+----------------+ 

雖然這個例子看起來有點荒謬,但它是基於一個真正的問題,當然是一個簡化。

事實上,很像這張表格(儘管分配的規則沒有說清楚),在詹姆斯國家還有其他人之前總會有一個'詹姆斯' - 所以例如從墨西哥交換詹姆斯來自墨西哥的Paul在這張桌子前面。

事實上,在大多數情況下,來自墨西哥的保羅將直接在墨西哥的詹姆斯之後,儘管這並不能保證。

那麼,什麼語法可以讓我執行這樣的查詢?是唯一可能的方法來做它將返回詹姆斯(ES?)的列表,然後使用WHERE country = mexico ||運行單獨的查詢。英國

回答

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 
+0

感謝這看起來像正確的答案 –

1
DECLARE @Test TABLE (Name nvarchar(100), Country nvarchar(100)) 


INSERT INTO @Test 
VALUES 
(N'James',N'Mexico'), 
(N'Peter',N'South Africa'), 
(N'Paul',N'Mexico'), 
(N'Colonel',N'Panama'), 
(N'James',N'United Kingdom'), 
(N'Hannah',N'United Kingdom') 


SELECT t2.* 
FROM @Test AS t 
INNER JOIN @Test AS t2 ON t.Country = t2.Country 
WHERE t.Name = N'James' 
1

最簡單的查詢,我能想到的這裏是一個IN查詢子句:

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