2009-09-23 163 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