2014-10-05 48 views
0

我有一个SQL语句,找到已在纪录片担任最高租金率从给定的架构演员:可能写这个sql触发器?

film: film_id, rental_rate, 
film_actor: actor_id, film_id 
film_category: film_id, category_id 
category: category_id, name 

SELECT * 
FROM actor 
WHERE actor_id IN 
     (SELECT actor_id 
     FROM film_actor 
     WHERE film_actor.actor_id = actor.actor_id 
     AND film_id IN 
       (SELECT film.film_id 
       FROM film, film_category, category 
       WHERE category.name = 'Documentary' 
       AND film.film_id = film_category.film_id 
       AND film_category.category_id = category.category_id 
       AND rental_rate = (SELECT MAX(rental_rate) 
            FROM film, category, film_category 
            WHERE category.name = 'Documentary' 
            AND film.film_id = film_category.film_id 
            AND film_category.category_id = category.category_id))); 

我被要求解释的一个问题是,是否有可能编写一条SQL语句来创建一个Oracle触发器,该触发器将为我在我写的sql语句中找到的任何演员主演的任何未来电影增加10%的rental_rate。我不能真正想到为什么我不能这样做的原因 - 除非我错过了一些东西,但是想要对此有第二意见,并且如果可能的话我该如何做到这一点

+0

如果出租率最高的纪录片实际上被错误分类,其纪录片类别被删除,会发生什么?如果电影的租金率发生变化,租金率最高的纪录片会发生变化,会发生什么?如果出现在租赁率最高的纪录片中的多个演员单独与未来电影相关联,会发生什么?如果出现在租赁率最高的纪录片中的演员与另一部电影错误地关联并且该协会被删除,该怎么办? – DrabJay 2014-10-05 20:21:03

回答

1

假设电影类别不会改变,你很可能可以做到这一点在一个触发器只有你有associative entityfilm_actor。其关键角色是实施filmactor之间的多对多关系。

但是作为“副作用”,你知道每次你给某个演员添加一部新电影时,或者每次添加至少演过一部电影的演员时,都会触及这张表。它也会被触及,你是以某种方式更新现有电影和现有演员之间的关联。

所以在这个表上使用触发器AFTER INSERT OR UPDATE就可以了。

+0

这听起来是合乎逻辑的方式,谢谢! – user3603183 2014-10-06 08:22:14

+0

一个简单的问题,你如何直接将这与电影表中rental_rate的变化联系起来? – user3603183 2014-10-06 09:31:49

+0

@ user3603183您可以通过'film_actor'上的触发器更新'film'。所以它不应该成为一见钟情。唯一复杂的事情可能是知道目标电影是否已经应用了+ 10%的租金。看看广告[旧的和新的相关名称](http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#LNPLS99955)。他们会允许你查询数据库,以了解奖金是否已经应用。试着对此做一点试验,如果你还需要一些帮助,请随时提出一个其他问题_。 – 2014-10-06 09:41:21