【问题标题】:How to represent relational division(basic algebra expression) in terms of SQL如何用 SQL 表示关系除法(基本代数表达式)
【发布时间】:2015-12-28 08:45:50
【问题描述】:

Query:查找已预订所有船只的船员姓名

这可以在关系代数中表示为:
1.π<sub>sname</sub> ( ((σ<sub>sid,bid</sub> Reserves) / (σ<sub>bid</sub> Boats)) ⋈ Sailors)

根据关系代数,除法也可以使用基本代数运算符表示如下:

  1. A/B= π<sub>x</sub>(A) - π<sub>x</sub>((π<sub>x</sub>(A) * B) - A )

因此,如果我 convert 声明 1 按照声明 2 那么

  1. Reserves/Boats= π<sub>sid</sub>(Reserves) - π<sub>sid</sub>(( π<sub>bid</sub>(Reserves) * Boats) - Reserves )

我如何用 SQL 表示Statement 3,就像在关系代数中一样(即不使用minus/Except(-) and Cross join(*) 以外的任何运算符)。
我试图在不使用NOT EXISTS and EXISTS 条件的情况下实现它。

表结构如下:
Sailors(sid: integer, sname: string, rating: integer, age: real)
Boats(bid: integer, bname: string, color: string)
Reserves(sid: integer, bid: integer, day: date)

【问题讨论】:

标签: sql oracle relational-algebra relational-division


【解决方案1】:

查询将是:

select 
  sailors.sname 
from (
  select r.sid 
    from reserves r 
   group by r.sid
   having count(distinct r.bid) = (select count(*) from boats) ) fullRes
join sailors 
on sailors.sid = fullRes.sid

你可以在这里测试它:

Example

【讨论】:

    【解决方案2】:

    鉴于此 DDL 用于与您的相关关系对应的表:

    create table Boats(
      bid int,
      bname varchar(50),
      color varchar(50)
    );
    
    create table Reserves(
      sid int,
      bid int,
      day date
    );
    

    您可以相当直接地将除法公式 (3) 转译为 Oracle SQL 语法,尽管它很冗长:

    -- All sailors who reserved at least one boat
    SELECT DISTINCT sid
    FROM Reserves
    
    MINUS 
    
    -- All sailors who reserved at least one boat, but not all of them
    SELECT sid
    FROM (
      -- all combinations of a sailor who reserved any boat with any boat
      -- available to be reserved:
      SELECT Reserves.sid, Boats.bid
      FROM
        Reserves
        CROSS JOIN
        Boats
    
      MINUS
    
      -- all combinations of sailor and boat for actual reservations made
      SELECT sid, bid
      FROM Reserves
    ) sids
    

    如指定,仅使用CROSS JOINMINUS 运算,以便直接对应关系代数公式。然而,在现实世界的数据库应用程序中,肯定会通过完全不同的查询获得相同的结果。

    另请注意,SQL 数据库可以并且确实违反了关系不包含重复元组的形式关系代数原则。这就是第一个子查询中SELECT DISTINCT 的原因。在查询的其他地方策略性地应用不同的选择可能会提高效率,但不会改变结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多