2012-04-27 20 views
2

我有一個關係,例如R(Owner,Car)。我怎樣才能讓擁有三輛關係代數的車主歸還? (並且不使用集合函數)如何在關係代數中編寫選擇具有n個屬性B的屬性A?

例如像σ(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 2012-04-27 07:45:32

+0

是的,是的。我自己嘗試過這一點,但無濟於事。 – noted 2012-04-27 08:59:29

回答

-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上被廣泛譴責。我使用它們不僅是因爲它符合OP的可用操作員列表,但坦率地說,在這些情況下,我發現它們比使用中綴INNER JOIN表示法更容易編寫。

+0

SQL中的完美答案。我設法自己解決這個問題,你的回答很好。 – noted 2012-04-27 19:26:17

0

你說σ(COUNT(Car)= 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))) 

其中\pi是投影,\sigma是選擇,x是笛卡兒積,則\rho重命名,\wedge表示結合和我假定關係汽車的屬性被稱爲ownervin