2011-08-19 94 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 
      );