我在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的结果集中显示的行越少。我希望我对此有意义......如果不是,请告诉我,我会尽力澄清。
关于如何使这项工作的任何想法? 谢谢你!
答案 0 :(得分:2)
您使用COUNT
,GROUP BY
和HAVING
来查找具有您所期望的那么多数学行的汽车:
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
)