2014-06-17 34 views
3

我的表格是這樣定義的:如何爲下表編寫SQL-Query?

名稱也是一個字符串和屬性。

ID | Name | Property 

該表中的數據的一個例子是這樣的:

ID | Name | Property 
1 Peter Newsletter 
2 Paul Register 
3 Peter Register 
4 Shaun Newsletter 
5 Steve Register 

現在我想查詢有物業的通訊和註冊所有的人。 因此,我應該得到彼得,因爲他有兩個財產。

因此產生的表應該是這樣的:

ID | Name | Property 
1 Peter Newsletter 
3 Peter Register 

所以一切我嘗試查詢是一個人有兩個屬性的通訊和註冊。

回答

5

這裏有一個方法:

select t.* 
from table t 
where exists (select 1 
       from table t2 
       where t2.name = t.name and t2.property = 'NewsLetter' 
      ) and 
     exists (select 1 
       from table t2 
       where t2.name = t.name and t2.property = 'Register' 
      ); 

如果你只是想名字與id是清單,也許,我會做,因爲:

select t.name 
from table t 
where t2.property in ('NewsLetter', 'Register') 
group by t.name 
having count(distinct property) = 2; 

您是怎樣的id列表s取決於您的數據庫,如listagg()group_concat()string_agg()

2

的替代,在同一行幾乎戈登的解決方案,但沒有使用EXISTS

select * from tablename 
where name in (select name from tablename where property = 'Newsletter') 
and name in (select name from tablename where property = 'Register') 
+0

我會嘗試你的兩種方法,現在我陷入其他的東西。給我一些時間,我會獎勵最好的工作方式,並接受它作爲解決方案=)到目前爲止謝謝 – PreDer

1

很難不知道更多有關資料,以確保。鑑於你給我們具體要求,這會給你顯示的結果:在您的要求會胡來

WITH multprop (multName) AS (
    SELECT NAME FROM myTable 
     WHERE Property IN('Newsletter','Register') 
     GROUP BY NAME 
     HAVING count(*)>1) 
select id, Name, Property 
from multprop inner join myTable 
     on multName = Name 

但細微的差別。例如,有沒有永遠是除了你列出的兩個以外的屬性值?或者一個名稱可以用同一個屬性多次顯示?

編輯:添加的WHERE子句將CTE中的行限制爲請求的特定的Property值的行。這是來自評論中更詳細的要求。

+0

有更多的財產比我列出的兩個,但這兩個是我感興趣的。名稱不能用相同的屬性多次顯示。 – PreDer

+0

您的評論縮小了可能性,因此WHERE子句現在限制了CTE(公用表表達式,即'WITH'子句)中的行。使用CTE是另一種非常值得學習的語法。 IN()謂詞可以是一個_sub-select_而不是一個明確的列表,以便所需的'Property'列表可以來自臨時表。 – user2338816

1

另一種方式:

SELECT * FROM T as T1 
WHERE Property IN ('Newsletter','Register') 
     AND EXISTS (SELECT * FROM T 
         WHERE Name=T1.Name 
          and Property IN ('Newsletter','Register') 
          and Property <> T1.Property 
       ) 

SQLFiddle demo

1

再一個,備案

WITH cteHasBoth 
as (select Name 
     from MyTable 
     where Property in ('Newsletter', 'Register') 
     group by Name 
     having count(*) = 2) 
select ID, Name 
    from MyTable 
    where name in (select Name from cteHasBoth) 

這將僅需要兩個通過表sacns。