2009-09-23 219 views
1

我在SQL Server中2个表2005分贝以表示为这样的结构:SQL查询查找精确匹配

CAR: CarID BIGINT, CarField BIGINT, CarFieldValue VARCHAR(50);

TEMP: CarField bigint,CarFieldValue varchar(50);

现在,TEMP表格实际上是一个表格变量,其中包含通过搜索工具收集的数据。根据TEMP中包含的数据,我希望过滤掉CAR表中所有DISTINCT CarID与TEMP表中的行完全匹配。一个简单的Inner Join运行良好,但我只想返回匹配ALL的所有中的行。基本上,TEMP中的每一行都应该表示为过滤器,而对于当前的内部联接查询,它们的行为更像过滤器。 TEMP中的行越多,我期望在CAR的结果集中显示的行越少。我希望我对此有意义......如果不是,请让我知道,我会尽力澄清。

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

回答

2

您使用COUNTGROUP BYHAVING发现有像您期望的正是许多mathicng行汽车:

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

+0

嗨雷莫斯,谢谢你的回应。与上面的David一样,我很遗憾,在刷新此页面之前,我没有等待更长的时间! – Shalan 2009-09-23 22:55:59

+0

不用担心Shalan – 2009-09-23 22:58:09

+0

实际上,remus,你很有道理,因为你已经很好地解释了它......并且使用更小的查询! +1 – Shalan 2009-09-23 23:07:07

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) 
+0

WOAH!我没有想到很多快速反应!谢谢大家的意见。 Astander,当我刷新这个页面时,你的唯一答案就是100%!谢谢你,请不要介意给我解释,以便我能更好地理解它?我看到了添加的连接列条件(我没有想到这样做!) – Shalan 2009-09-23 22:49:42

+0

我所做的就像你或通常所做的那样。做连接,但要计算出现的次数。将这些事件与临时表中的实际条目数进行比较。 COUNT(1)只计算临时表中的行数,您可以使用*或任何字段/值。只是通过使用1 – 2009-09-24 04:56:48

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子句应将结果缩减为符合所有条件的结果。

+0

避免查找字段嗨大卫,并感谢您的回应!我希望我可以将所有3个标记为答案,但不幸的是,我首先看到了安斯坦德的回应,并立即尝试了它。但是,从可读性的角度来看,您的更容易理解。 – Shalan 2009-09-23 22:51:58

+0

@Shalan:一切都很好。无论如何,我认为我们都朝着同一个方向前进! – 2009-09-23 23:52:00

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 
) 
+0

您好,不客气,谢谢!实际上所有行都将具有跨所有列的值。 CAR实际上是一个与其他两个表的关联表 – Shalan 2009-09-23 23:10:43

+0

啊,我误解了这个问题,并没有意识到temp代表了搜索条件。 – 2009-09-23 23:35:52