質問する
230 次
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
仮定します。owner
vin
于 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 JOIN
OPの使用可能な演算子のリストに適合するだけでなく、率直に言って、これらの状況では、中置記法を使用するよりもはるかに簡単に記述できるため、これらを使用しています。
于 2012-04-27T12:43:38.063 に答える