Relational-Algebra

翻譯關係代數輸出

  • February 27, 2018

我有以下關係Jobs(name, company, salary)

P1(salary) = πsalary(σcompany='pwc'(Jobs))
P2(salary) = πsalary(ρT1(s)(P1) thetaJoin(s>salary) P1)
P3(salary) = P1 − P2

我知道P1只是選擇所有工作的人的薪水pwc

我很難弄清楚是什麼P2指示。

我知道將屬性ρT1(s)(P1)重命名P1為. 但是後來我對這部分感到困惑,因為我認為並且會是一樣的。T1``salary``s``thetaJoin(s>salary)``s``salary

P3``P1只是和之間的區別P2

最後的關係

Final(name) = πname(Jobs thetaJoin(salary>s) ρT2(s)(P3))

將取決於什麼P2手段。

請幫我做這個翻譯。

P2(salary) = πsalary(ρT1(s)(P1) thetaJoin(s>salary) P1)

來自關係代數的維基百科條目:

僅當 S 和 R 的標頭不相交,即不包含公共屬性時,才定義 θ-join 的結果。

因此,在基本操作中對該操作的模擬如下:

R ⋈θ S = σθ(R × S)

為確保標題不相交,必須重命名薪水(此處為“s”)。為確保關係為此自連接唯一命名,還必須重命名 P1(此處為“T1”)。

在粗略的 SQL 術語中:

DECLARE @P1 table (salary integer NOT NULL);
INSERT @P1 (salary) VALUES (1), (2), (3);

WITH T1 (s) AS (SELECT DISTINCT salary FROM @P1)
SELECT DISTINCT
   P1.salary
FROM @P1 AS P1 
JOIN T1
   ON T1.s > P1.salary;

-- or, closer to the fundamental operations:

WITH T1 (s) AS (SELECT DISTINCT salary FROM @P1)
SELECT DISTINCT
   P1.salary
FROM @P1 AS P1
CROSS JOIN T1
WHERE T1.s > P1.salary;

小提琴手

| 工資 |
| ------ |
| 1 |
| 2 |

因此,P2 包含所有小於其他工資值的工資值。

因此,P1 減去 P2 包含了 PWC 的最高工資。

另請參閱使用關係代數找到最大值

請考慮以下內容以進行驗證,因為我不是關係代數方面的專家。

s在我看來絕對不一樣,salary因為它們屬於不同的關係。如果您認為它們相同,則您可能會認為它們P1相同P2-再次,事實並非如此。關係操作的每個結果都應該被視為一個獨立的關係。

在我的理解中,包含工資不是最低的P2所有行(如果是,則為假)。正如您正確陳述的那樣,差異在於,它包含薪水最低的行。P1``s>salary``P3

引用自:https://dba.stackexchange.com/questions/198787