2
4

3 に答える 3

0
\pi_{Car.owner}(\sigma_{Car.owner = C1.owner\wedge 
                        C1.owner = C2.owner\wedge 
                        Car.vin != C1.vin\wedge 
                        C1.vin != C2.vin\wedge 
                        Car.vin != C2.vin}(Car x 
                                           \rho_{C1}(Car) x 
                                           \rho_{C2}(Car)))
 -
 \pi_{Car.owner}(\sigma_{Car.owner = C1.owner\wedge 
                        C1.owner = C2.owner\wedge 
                        C2.owner = C3.owner \wedge
                        Car.vin != C1.vin\wedge 
                        C1.vin != C2.vin\wedge 
                        Car.vin != C2.vin \wedge
                        Car.vin != C3.vin\wedge 
                        C1.vin != C3.vin\wedge 
                        C2.vin != C3.vin}(Car x 
                                           \rho_{C1}(Car) x 
                                           \rho_{C2}(Car) x
                                           \rho_{C3}(Car)))

ここで、\piは射影、\sigmaは選択、xはデカルト積、\rhoは名前変更、接続詞を表し、関係Carの属性はと呼ばれると\wedge仮定します。ownervin

于 2012-05-01T18:39:13.087 に答える
0

σ(COUNT(Car)=3)(R) と言いましたが、COUNT は集計関数です。

集計がなければ、私が見る唯一の方法は、R テーブルの行を行カウント Owner でループすることです。何かのようなもの:

for each row
    If owner=previous_owner then n_cars++ 
    else (if n_cars>=3 then return owner
end
于 2012-04-27T08:12:16.367 に答える
-1

これを行う1つの方法は、SQLで、関係代数に変換しやすい演算子を使用し、わずかに異なるテストデータ(異なるタイプ、同じ名前)を使用することです。

WITH R 
     AS
     (
      SELECT * 
        FROM (
              VALUES (1, 1), 
                     (2, 2), (2, 3),
                     (3, 1), (3, 2), (3, 3),
                     (4, 1), (4, 2), (4, 3), (4, 4)
             ) AS T (Owner, Car)
     ),
     OwnersWithAtLeastThreeCars
     AS
     (
      SELECT DISTINCT R1.Owner
        FROM R AS R1, R AS R2, R AS R3
       WHERE R1.Owner = R2.Owner
             AND R2.Owner = R3.Owner
             AND R1.Car <> R2.Car
             AND R1.Car <> R3.Car
             AND R2.Car <> R3.Car
     ),
     OwnersWithAtLeastFourCars
     AS
     (
      SELECT DISTINCT R1.Owner
        FROM R AS R1, R AS R2, R AS R3, R AS R4
       WHERE R1.Owner = R2.Owner
             AND R2.Owner = R3.Owner
             AND R3.Owner = R4.Owner
             AND R1.Car <> R2.Car
             AND R1.Car <> R3.Car
             AND R1.Car <> R4.Car
             AND R2.Car <> R3.Car
             AND R2.Car <> R4.Car
             AND R3.Car <> R4.Car
     )
SELECT * FROM OwnersWithAtLeastThreeCars
EXCEPT       
SELECT * FROM OwnersWithAtLeastFourCars;

ps私は「古いスタイル」(つまり1992年以前)の標準SQL結合を使用しています。これは、Stackoverflowで広く非難されています。INNER JOINOPの使用可能な演算子のリストに適合するだけでなく、率直に言って、これらの状況では、中置記法を使用するよりもはるかに簡単に記述できるため、これらを使用しています。

于 2012-04-27T12:43:38.063 に答える