2012-04-27 1 views
2

나는 관계가있다. R(Owner,Car). 관계형 대수학에서 3 대의 자동차를 소유 한 소유자를 어떻게 반환 할 수 있습니까? (및 집계 함수를 사용하지 않고)관계형 대수학에서 n attributeB를 갖는 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 프로젝션입니다

+0

SQL에 대한 완벽한 대답. 나는이 문제를 스스로 해결할 수 있었고 당신의 대답은 훌륭하게 일치한다. – noted

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))) 

, \sigma\rho는, 이름을 변경한다 \wedge이 결합을 나타내고 내가 ownervin 호출 관련하여 자동차의 특성을 가정 x는 직교 제품, 선택이다.

관련 문제