2011-08-19 95 views
4

我有兩張包含不同公司的表格。我想從tableOne中選擇出現在tableTwo(事實上,只有在出現在tableTwo中時)。我會通過比較他們的companyID字段來做到這一點。它們也必須具有相同的值,列someYear。換句話說,我想要退還中出現的公司tableOne,當且僅當他們的someYear列匹配。根據匹配列進行選擇

tableOne 

companyID someYear 
--------- -------- 
1   2010 
2   2009 
3   2011 
1   2011 
7   2009 


tableTwo 

companyID someYear 
--------- -------- 
1   2010 
2   2008 
3   2011 
4   2011 
5   2009 

我想回到13(公司2的一年有所不同,所以我不希望它)。我徒勞的:

SELECT one.* 
FROM tableOne one, tableTwo two 
WHERE one.[companyID] in (
    SELECT DISTINCT companyID 
    FROM tableTwo 
) 
and one.someYear = two.someYear; 

這裏的問題是,它返回數百萬行的,當兩個表包含少於10,000個條目。由於敏感信息,我無法重新創建輸出。這裏的表格/列名都是由我可以確定的。另外我也許應該指出,這兩個表都沒有主鍵。我認爲這會導致他們沒有任何東西可以匹配。我正在使用SQL Server 2008.任何幫助將非常感激。

回答

11

試試這個

select one.* 
from tableOne as one 
    inner join tableTwo as two 
    on one.companyID = two.companyID and 
     one.someYear = two.someYear 
+3

+1,葉氏,一個簡單的'INNER JOIN'是正確的答案 – Lamak

+0

@Lamak我尷尬壞在任何涉及一個加入,我應該去學習他們正確。 我只是有一個簡單的跟進問題。這個查詢返回的行數多於'tableTwo'中的數據,這是我根本沒有想到的。看一些返回的行,我可以看到一些重複。很明顯,我可以使用'DISTINCT'來取出這些。我只是想知道,爲什麼這些副本會發生?它們在兩個表中都不重複。例如,一個公司在'tableTwo'中有兩行,但是這個查詢返回三個 - 其中兩個是相同/重複的。 – MadScone

+2

@MadScone - 如果在tabelOne中有重複的行,並且有一行匹配tableTwo中的重複行,那麼您將在tableOne中的每行結果集中獲得一行。 –

4

INNER JOIN是不執行半聯接的唯一途徑。這裏是做同樣的另一種同樣有效的方式:

SELECT * 
    FROM tableOne one 
WHERE EXISTS (
       SELECT * 
       FROM tableTwo two 
       WHERE one.companyID = two.companyID 
         AND one.someYear = two.someYear 
      );