【问题标题】:Converting SQL into Relational Algebra - what to do next?将 SQL 转换为关系代数 - 下一步该做什么?
【发布时间】:2016-08-26 03:32:23
【问题描述】:

我正在尝试将 SQL 命令转换为关系代数。最大的问题是有一个“NOT IN”SQL 语句不在关系代数中。

我的查询是这样的:

从员工中选择员工 id、姓氏和 training_id(来自培训),这些员工接受过本季度的培训,但不具备此培训的所有先决条件 - 因此他们从未完成过先决条件培训。

如果结果以X结尾,则表示没有成功完成。

表格:

employee(employee_id, first_name, last_name)
training(training_id, quartal, year, name)
enrollment(employee_id, training_id, quartal, year, result)
prerequisity(training_id, prerequisity_id)

我的 SQL 查询:

select e.employee_id, lastname, training_id from employee as e NATURAL JOIN enrollment NATURAL JOIN training NATURAL JOIN prerequisity WHERE quartal = 'first' and year = '2016'  and training_id NOT IN (select e.training_id from enrollment as e NATURAL JOIN employee as ee where e.employee_id=ee.employee_id and result not like '%X' and result is not NULL)

这可能是正确的 SQL,所以现在我要把它转换成关系代数:

PROJECT[employee_id,lastname, training_id](SELECT[quartal='first',year='2016'](employee@enrollment@training@prerequisity)) # here is the problem

如何在 RA 中模拟“NOT IN”命令?

【问题讨论】:

    标签: sql relational-algebra


    【解决方案1】:

    我建议你使用Set Difference (−)

    集差运算的结果是元组,它们存在于一个关系中,但不存在于第二个关系中。

    PROJECT[employee_id,lastname, training_id](SELECT[quartal='first',year='2016']
        (employee@enrollment@training@prerequisity))  - (PROJECT training_id ....
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 2018-09-11
      相关资源
      最近更新 更多