2015-05-29 73 views
1

我的問題是非常相似,這個以前的帖子 SQL Query, get a columns if another columns equal to xSQL - 返回所有行其中至少一個具有值「Y」

唯一不同的是,我將兩個表與以前的解決方案似乎不工作。基本上我有兩個列一旦表加入。我需要名稱的所有行,其中至少有一行的名稱具有「Shasta」作爲位置。例如,

列1 =名稱(來自表1) 第2列=位置(從表2)

Name | Location 
------------------- 
Bob | Shasta 
Bob | Leaves 
Sean | Leaves 
Dylan | Shasta 
Dylan | Redwood 
Dylan | Leaves 

應該返回:

Name | Location 
-------------------- 
Bob | Shasta 
Bob | Leaves 
Dylan | Shasta 
Dylan | Redwood 
Dylan | Leaves 

我嘗試先前的溶液後

where x in 
(
    select distinct x 
    from table 1 
    where y like 'Shasta' 
) 

不幸的是,它只返回:

Name | Location 
-------------------- 
Bob | Shasta 
Dylan | Shasta 
+0

你需要給我們喲你現有的查詢。 – cha

+0

你正在使用哪些DBMS? Postgres的?甲骨文? –

回答

1

您正在查找WHERE EXISTS子句。作爲一個例子,讓我們假設你有以下查詢:

select a.Name, b.Location 
from table1 a 
join table2 b on a.TableBId = b.Id 

您正在尋找檢索所有行此查詢其中存在一行在同一查詢結果與Name和地方Location = 'Shasta'。因此,我們可以使用查詢作爲派生表,匹配Name並尋找一個Location = 'Shasta'

select a.Name, b.Location 
from table1 a 
join table2 b on a.TableBId = b.Id 
where exists (
    select 1 
    from 
    (
     select a.Name, b.Location 
     from table1 a 
     join table2 b on a.TableBId = b.Id 
    ) x --this is the same as the above query, as a derived table 
    where x.Name = a.Name --correlate the queries by matching the Name 
    and x.Location = 'Shasta' --look for the column value in question 
) 

當然,你可以在WHERE EXISTS子句中,以簡化這個查詢和/或消除派生表,根據關於實際模式以及table1table2所代表的內容。

0

我認爲你應該做的另一個子查詢。我會打電話給joinresult joinedTable,因爲您沒有向我們展示您創建表格的聲明。但是您可以切換joinedTable作爲您的聲明。然後做

select * from joinedTable where name in (select name from joinedTable where location = 'Shasta'); 

結果是你想要的東西:2X鮑勃,3迪倫

繼承人搗鼓它:

http://sqlfiddle.com/#!9/7584e/3

0

只需使用EXISTS返回行,如果存在一個排具有相同的名稱和位置沙斯塔:

select name, location 
from tablename t1 
where exists (select 1 from tablename t2 
       where t1.name = t2.name 
       and t2.locaion = 'Shasta') 
相關問題