如何在 SQL Server 中实现 DIVIDE 操作的关系等效项

2024-01-11

我正在阅读一本教科书上的关系代数。 我碰到除法运算 http://en.wikipedia.org/wiki/Relational_algebra#Division_.28.C3.B7.29。来自维基百科:

除法是一个二元运算,写为 R ÷ S。结果由 R 中的元组对 R 特有的属性名称的限制组成,即在 R 的标头中但不在 S 的标头中,为此它认为它们与 S 中元组的所有组合都存在于 R 中。

因此,如果 R 是:

+----+----+
| A  | B  |
+----+----+
| a1 | b1 |
| a2 | b1 |
| a3 | b1 |
| a4 | b1 |
| a1 | b2 |
| a3 | b2 |
| a2 | b3 |
| a3 | b3 |
| a4 | b3 |
| a1 | b4 |
| a2 | b4 |
| a3 | b4 |
+----+----+

且 S 为:

+----+
| A  |
+----+
| a1 |
| a2 |
| a3 |
+----+

那么输出应该是:

+----+
| B  |
+----+
| b1 |
| b4 |
+----+

现在,本书给出了计算 DIVIDE 运算的关系等效步骤,如下所示。 我试图在 SQL Server 中完全模仿它,但方向不对



  T1 ← πBR                //that is SELECT A FROM R
  T2 ← πB((S x T1) - R)   //SxT1 can simply be done as SELECT * FROM S,T1                                     
  T ← T1 - T2                        
  

你的公式不准确。在您的特定情况下,您需要投影B而不是投影A否则如何B属性会出现在结果中吗?

  T1 ← πBR                
  T2 ← πB((S x T1) - R)                                     
  T ← T1 - T2  

查询:

-- T ← T1 - T2 -------------------------------------
SELECT DISTINCT B FROM R -- T1 ← πBR              --
WHERE B NOT IN (                                  --
    -- T2 ← πB((S x T1) - R) -------------------  --
    SELECT CR.B                               --  --
    FROM (                                    --  --
        -- (S x T1) --------------------      --  --
        SELECT S.A, R2.B              --      --  --
        FROM S                        --      --  --
        CROSS JOIN (                  --      --  --
            -- T1 ← πBR               --      --  --
            SELECT DISTINCT B FROM R  --      --  --
        ) AS R2                       --      --  --
        --------------------------------      --  --
    ) AS CR                                   --  --
    WHERE NOT EXISTS (                        --  --
        SELECT *                              --  --
        FROM R                                --  --
        WHERE R.A = CR.A AND R.B = CR.B       --  --
    )-------------------------------------------  --
)---------------------------------------------------

结果:

B
--
b1
b4

SQL小提琴 http://sqlfiddle.com/#!3/7251e/1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 SQL Server 中实现 DIVIDE 操作的关系等效项 的相关文章

随机推荐