SQL查询使用内部联接查找完全匹配

时间:2009-09-23 22:27:28

标签: sql-server-2005 inner-join

我在SQL Server 2005 db中有2个表,结构表示如下:

CAR CarID bigint, CarField bigint, CarFieldValue varchar(50);

TEMP: CarField bigint,CarFieldValue varchar(50);

现在,TEMP表实际上是一个表变量,包含通过搜索工具收集的数据。基于TEMP中包含的数据,我希望过滤掉并从CAR表中获取与TEMP表中的那些行完全匹配的所有DISTINCT CarID。一个简单的内连接效果很好,但我想只返回与TEMP中的 ALL 行完全匹配的CarID。基本上,TEMP中的每一行都应该表示 AND 过滤器,而使用当前的内部连接查询,它们更像是 OR 过滤器。 TEMP中的行越多,我期望在CAR的结果集中显示的行越少。我希望我对此有意义......如果不是,请告诉我,我会尽力澄清。

关于如何使这项工作的任何想法? 谢谢你!

4 个答案:

答案 0 :(得分:2)

您使用COUNTGROUP BYHAVING来查找具有您所期望的那么多数学行的汽车:

   select CarID
   from CAR c  
   join TEMP t on c.CarField = t.CarField and c.CarFieldValue = t.CarFieldValue
   group by CarID
   having COUNT(*) = <the number you expect>;

您甚至可以将<the number you expect>设为select COUNT(*) from TEMP之类的标量子查询。

答案 1 :(得分:1)

SELECT *
FROM (
SELECT CarID,
COUNT(CarID) NumberMatches
FROM CAR c INNER JOIN
TEMP t ON c.CarField = t.CarField
AND c.CarFieldValue = t.CarFieldValue
GROUP BY CarID
) CarNums
WHERE NumberMatches = (SELECT COUNT(1) FROM TEMP)

答案 2 :(得分:1)

...槽糕

;WITH FilteredCars
AS
(
  SELECT C.CarId
  FROM Car C
  INNER JOIN Temp Criteria 
     ON C.CarField = Criteria.CarField 
    AND C.CarFieldValue = Critera.CarFieldValue
  GROUP BY C.CarId
  HAVING COUNT(*) = (SELECT COUNT(*) FROM Temp)
)
SELECT *
FROM FilteredCars F
INNER JOIN Car C ON F.CarId = C.CarId

基本前提是,对于将INNER JOIN与临时表匹配的所有条件,必须生成与该表中的记录一样多的记录。 FilteredCars查询末尾的HAVING子句应该将结果归结为符合所有条件的结果。

答案 3 :(得分:1)

没有测试过这个,但我认为你不需要做任何你需要的计数。这个查询应该大大加快,因为它可以避免潜在的大量计数。此查询查找缺少值的所有汽车,然后将其过滤掉。

select distinct carid from car where carid not in
(
select
  carid
from
  car c
  left outer join temp t on
    c.carfield = t.carfield
    and c.carfieldvalue = t.carfieldvalue
where
  t.carfield is null
)