2012-09-22 2 views
5

SQL 표현 NOT IN에 해당하는 관계형 대수가 있습니까?SQL의 관계형 대등 물 "NOT IN"

A1 | A2 
---------- 
x | y 
a | b 
y | x 

내가 A1이 A2에있는 관계에있는 모든 튜플을 제거하려면 : 예를 들어

나는 관계가있는 경우. SQL에서 나는 조회 수 : 정말 날 유세 무엇

SELECT 
    * 
FROM 
    R 
WHERE 
    R.A1 NOT IN 
     (
     SELECT 
      A2 
     FROM 
      R 
     ) 
/

는 관계 대수 선택 연산자 안에 하위 쿼리하는 방법이며,이를 가능?

σ 여기에 몇 가지 하위 쿼리 R

답변

6

에 관계형 대수학에서, 당신은 carthesian 제품을 사용하여 이것을 할 수 있습니다. 같은 :

R - A1 ρ ( π A11, A2, A21 A11 = A22 ( A11, A21 (R) ρ X ρ A12, A22 (R))))

  • R, fe A1 (왼쪽)과 A12 (오른쪽) A11까지
  • 은 A11는 A22은
  • 프로젝트 밖으로 A12 같고 A22 및
  • 선택 행이 계속 이름이 바뀐 열을 가진 R의의 십자가 제품을 A11 및 A21
  • a1 및 a2로 이름 바꾸기

그러면 일치하는 행이 표시됩니다. 일치하지 않는 행을 찾으려면 R에서이 값을 뺍니다.

+1

당신이 어떻게 작동하는지 설명 ... 어쩌면 줄임표 점을 확장하십시오 수 있습니다. 교차 제품의 결과를 이해하는 데 어려움을 겪고 있습니다. R에는 두 개의 필드 만 있으므로 두 개 이상의 인수를 사용하여 어떻게 pi 연산자를 넣을 수 있습니까? – jsj

+0

두 개의 열만있는 경우 줄임표를 생략 할 수 있습니다. 그 답은 또한 RHO를 사용해야했던 곳에서 PI를 사용했는데, 그것이 편집에 있었는지 확실하지 않았거나 원래의 대답이었습니다. – Andomar

+0

@Andomar : 또한 관계형 대수학 문제에 문제가 있습니다. 나는 내 질문 [여기] (http://stackoverflow.com/questions/18997845/how-to-convert-sql-to-relational-algebra-incase-of-sql-joins)을 올렸다. 여기 좀 도와 줄 수있어? 감사. –

2

개방 질문은 우리를 잘못된 생각으로 보냅니다. 다음과 같아야합니다.

SQL 표현 R WHERE ... [NOT] IN S에 해당하는 관계형 대수가 있습니까?

대답은 '예, 그것은 (자연)에 나비 넥타이 연산자 일명 JOIN이다 (즉, 대답은 두 개의 관계, 하지 필터의 일종. 사이에 작업입니다).

이유를 알아 보려면 먼저 주어진 SQL 솔루션을 정리해 보겠습니다. 그림과 같이 속성 A1 NOT IN이 단일 속성 A2과의 관계를 찾고 있습니다. 속성 이름에 실제로는 일치하지 않습니다. SQL은 where 조건 내에 NOT을 허용합니다. 이 SQL을 사용하면 논리 구조가 더 명확 해집니다.

SELECT * FROM R 
WHERE NOT (A1 IN (SELECT A2 AS A1 FROM R)) 

이제 투영과 이름 바꾸기를 볼 수 있습니다. (주위에 NOT 우리는 첫 번째 답변 당 MINUS 세트로 구현할 수 있습니다.) 그래서 해당하는 RA는 다음과 같습니다

R - (R ⋈ ρ A1/A2 A2 관심을(R)))

, 자습서 D는 다음과 같습니다

질문을 넣어하는 방법으로
R MINUS (R JOIN (R {A2} RENAME A2 AS A1)) 

가있다 SQL 사고에서 숙취. SQL의 WHERE은 당신을 행 수준의 '모드'로 만듭니다. 이것은 일련의 at-a-time 운영자를 요구하는 contra Codd의 규칙 7입니다.

일반적으로 행 수준 필터가있는 SQL의 WHERE 및 RA의 σ은 한 번에 한 세트의 논리로 (자연) JOIN으로 간결하게 구현 될 수 있습니다. (예를 들어,이 다웬가 대수에 무슨 일 &입니다.)