根据匹配的列进行选择

时间:2011-08-19 14:08:11

标签: sql sql-server sql-server-2008

我有两张桌子,都包含各种公司。我想从tableOne中显示的tableTwo中选择所有内容(事实上,只有它出现在tableTwo中)。我会通过比较他们的companyID字段来做到这一点。它们对于列someYear也必须具有相同的值。换句话说,当{并且仅当他们的tableTwo列匹配时,我想从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.任何帮助都将非常感激。

2 个答案:

答案 0 :(得分:11)

试试这个

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

答案 1 :(得分:4)

INNER JOIN不是执行半连接的唯一方法。这是另一种同样有效的方法:

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