1

我在 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。一个简单的 Inner Join 效果很好,但我只想取回与 TEMP 中的所有行完全匹配的 CarID。基本上,TEMP 中的每一行都应该表示一个AND过滤器,而对于当前的内部连接查询,它们更像是OR过滤器。TEMP 中的行越多,我希望在 CAR 结果集中显示的行越少。我希望我对此有意义......如果不是,请告诉我,我会尽力澄清。

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

4

4 回答 4

2

您使用COUNT,GROUP 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.

于 2009-09-23T22:33:36.843 回答
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)
于 2009-09-23T22:33:38.340 回答
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
)
于 2009-09-23T22:42:27.667 回答
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 子句应将结果调整为符合所有条件的结果。

于 2009-09-23T22:36:23.157 回答