SQL子查询可以让30多部电影中的演员

时间:2016-09-24 00:05:19

标签: sql sql-server

我需要找到参与30多部电影的演员的所有名字。下面的内容并不是很好。我在这里做错了什么?

SELECT first_name, last_name
FROM actor A
WHERE 30 > (SELECT COUNT(actor_id) FROM film_actor);

涉及的表格:

  • 演员: actor_id first_name last_name last_update
  • 电影: film_id标题说明release_year language_id original_language_id rental_duration rental_rate length replacement_cost rating special_features last_update
  • film_actor: actor_id film_id last_update

4 个答案:

答案 0 :(得分:4)

试试这个:

SELECT      a.first_name, a.last_name
FROM        actor       a
INNER JOIN  film_actor  fa  ON a.actor_id = fa.actor_id
GROUP BY    a.actor_id, a.first_name, a.last_name
HAVING      COUNT(fa.film_id) > 30

答案 1 :(得分:1)

您当前查询的行为说明

您当前的查询在actorfilm_actor表之间没有任何关联的情况下运行,因此结果将是奇怪的,并且实际上显示actor中的每个参与者表,如果整个film_actor表中具有非空值actor_id的行数小于30。

完成任务的正确方法

INNER JOIN与grouping和having子句一起使用,仅显示参与至少30部电影的演员。

如果您的表actor_id, film_id中的一对film_actor是唯一的,那么此查询就足够了:

SELECT a.actor_id,a.first_name, a.last_name
FROM actor a
INNER JOIN film_actor fa ON
  a.actor_id = fa.actor_id
GROUP BY a.actor_id, a.first_name, a.last_name
HAVING COUNT(fa.film_id) > 30

但是,如果你要存储一个角色扮演者可以在一部电影中播放,那么前面提到的那对不是唯一的,那么在having子句中添加distinct:

HAVING COUNT(DISTINCT fa.film_id) > 30

请注意,我已将actor_id添加到select和group by子句中,因为两个actor可以具有相同的名字和姓氏,并且您可能希望清楚地看到这些情况。

答案 2 :(得分:1)

  

使用加入查询代替尝试此

SELECT first_name, last_name
FROM actor a
JOIN actor_film af
ON(a.actor_id = af.actor_id)
WHERE (SELECT count(af.film_id) FROM af) > 30

答案 3 :(得分:0)

这也是一个不错的选择,如果我们有共同的列,那么最好只使用GROUP BY中的一个,而使用聚合函数的其余部分如下所示:

var crypto = require("crypto");
var fs = require("fs");
var Request = require("request");

var hashKey = function(key) {
  var hash = crypto.createHash("sha256");
  key = new Buffer(key);
  hash.update(key);
  return hash.digest("base64");
};

var GCS = module.exports = function GCS(env) {
  // config contains the encryption key I'd like to specify.
  this.config = env.config
};

GCS.prototype.upload = function (url, buffer) {
  var self = this;
  return new Promise(function(resolve, reject) {
    var headers = { 
      "Content-Length": buffer.size,
      "x-goog-encryption-algorithm": "AES256",
      "x-goog-encryption-key": self.config.encryption.key, 
      "x-goog-encryption-key-sha256": hashKey(self.config.encryption.key)
    };

    var options = {
      url: url,
      method: "PUT",
      headers: headers
    };

    fs.createReadStream(buffer.path)
    .pipe(Request(options))
    .on("error", function(e) {
      self.logger.error("Failed to upload asset to slot.", e);
      reject(e);
    })
    .on("response", function(res){
      if (res.statusCode != 200) {
        reject(new Error("Unexpected response code" + res));
      }
      resolve(res);
     });
  });
};