2012-04-27 5 views
2

私はリレーションを持っています。 R(Owner,Car)。リレーショナル代数で3台の車を所有しているオーナーを返すにはどうすればいいですか? (集合関数を使用せずに)リレーショナル代数でn属性Bを持つselect attributeAを書くには?

例えばσ(COUNT(Car)=3)(R)のようなものですが、集約関数を使用していませんか?

e.g. 
given   return 
+-+----+   +-+----+ 
|a|attX|   |a|attX| 
+-+----+   +-+----+ 
|a|attY| ==> |a|attY| 
+-+----+   +-+----+ 
|a|attZ|   |a|attZ| 
+-+----+   +-+----+ 
|b|attX| 
+-+----+ 
|c|attW| 
+-+----+ 
|c|attX| 
+-+----+ 
|c|attY| 
+-+----+ 
|c|attZ| 
+-+----+ 

編集:お返事ありがとうございますが、私はこれをリレーショナル代数で書く方法を探しています。これには、σπX、などの演算子を使用してフォームを意味します。

+0

"集合関数を使用しない" - これは規定の要件ですか?宿題? – onedaywhen

+0

はい、はいです。私はこれを自分自身で無駄にしようとしました。 – noted

答えて

-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私はStackoverflowで広く非難されている '古いスタイル'(つまり、1992年以前の)標準SQL結合を使用しています。私はOPの利用可能な演算子のリストに適合しているだけでなく、率直に言って、このような状況では、インフィクスINNER JOINの表記を使うよりもはるかに簡単です。 \pi投影、\sigmaある

+0

SQLで完璧な答え。私はこれを自分自身で解決することができました。あなたの答えはうまく対応しています。 – noted

0

あなたはσ(COUNT(車)= 3)(R)言ったが、COUNTは集計関数です。

は凝集せず、私が見る唯一の方法は、行カウント所有者によるRのテーブルの行をループです。ような何か:

for each row 
    If owner=previous_owner then n_cars++ 
    else (if n_cars>=3 then return owner 
end 
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))) 

は、xはデカルト積である、選択され\rhoが名前変更され、\wedgeは、連携を表し、Iは関係車の属性はownervin呼び出されると仮定する。

関連する問題