1

SQL Server 2005 dbには、次のように表された構造を持つ2つのテーブルがあります。

CAR: CarID bigint、CarField bigint、CarFieldValue varchar(50);

TEMP: CarField bigint、CarFieldValue varchar(50);

これで、TEMPテーブルは、実際には検索機能を通じて収集されたデータを含むテーブル変数になります。TEMPに含まれているデータに基づいて、すべてのDISTINCT CarIDをフィルターで除外し、TEMPテーブルのこれらの行と完全に一致するCARテーブルから取得したいと思います。単純な内部結合はうまく機能しますが、TEMPのすべての行に正確に一致するCarIDのみを取得したいと思います。基本的に、TEMPの各行はANDフィルターを示すことになっていますが、現在の内部結合クエリでは、 ORフィルターのように機能します。TEMPの行が多いほど、CARの結果セットに表示されると予想される行は少なくなります。私はこれで私が理にかなっていることを願っています...そうでない場合は私に知らせてください、そして私は明確にしようとします。

これを機能させる方法について何かアイデアはありますか?ありがとう!

4

4 に答える 4

2

を使用してCOUNT、予想どおりに多くのmathicng行を持つ車を検索します。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

うーん...

;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

基本的な前提は、すべての基準が内部結合を一時テーブルと照合するために、そのテーブル内にあるのと同じ数のレコードを生成する必要があるということです。FilteredCarsクエリの最後にあるHAVING句を使用すると、すべての基準に一致する結果になります。

于 2009-09-23T22:36:23.157 に答える
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 に答える