在一个表中插入多行IN,每个记录的列具有不同的参考值

时间:2014-05-08 01:16:01

标签: mysql sql join insert

我有三张桌子:

  

电影[mID,title,year,director]
  评级[rID(外键),mID(外键),星级,ratingDate]
  审稿人[rID,姓名]

我必须在表格评分中插入评论,以及#34; James" (在表Reviewer中)给数据库中的每部电影5颗星,将ratingDate保留为" NULL"

到目前为止,我已经能够使用表格Movie中的每个mID加入James的rID。

SELECT * FROM (SELECT rID FROM reviewer WHERE name = "James") AS a LEFT JOIN (SELECT mID FROM movie) AS b ON 1=1;

我不知道如何将5星和NULL ratingDate添加到每个条目中,最后将所有这些添加到我的评级表中。

我的问题是,它是否可以在一个查询中完成(我想象的有多个子查询),或者我是否采取了错误的方法。这似乎是一个相对简单的问题,但我无法绕过它。

3 个答案:

答案 0 :(得分:1)

试试这个:

INSERT INTO Rating(rID, mID, stars, ratingDate)
  SELECT r.rID, m.mID, 5, NULL
  FROM Movie m CROSS JOIN
       (SELECT r.Rid
        FROM Reviewer r
        WHERE r.name = 'James'
       ) r

请注意以下事项:

  • 列在insert语句中明确列出。
  • select查询中的表格给出了别名,这些是表名的缩写。
  • 使用了CROSS JOIN,因为MovieReviewer之间确实没有连接条件。
  • 字符串文字('James')用单引号括起来,而不是双引号。

答案 1 :(得分:0)

这应该可以解决问题:

INSERT INTO Rating
  SELECT
    Reviewer.rID,
    Movie.mID,
    5,
    NULL
  FROM
    Movie
    INNER JOIN Reviewer ON Reviewer.name="James"

说明:

  • INNER JOIN和奇怪的ON子句的组合关注边缘情况,James不存在作为评论者
  • 字段列表选择所需字段

答案 2 :(得分:0)

- 根据您的要求插入数据: INSERT INTO评级(rid,mid,stars,ratingDate) SELECT r.rID,        m.mID,        5,        空值 来自电影m JOIN Reviewer r ON(r.name =" James");

另外,如果你执行类似的" SELECT"我建议你输入以下索引。声明: 在Reviewer(name)上创建索引idx_reviewer_name;

我想提醒您将当前日期作为ratingDate字段的默认值。如果您需要自动插入评级日期,它可以帮助您确保数据库本身的当前日期。

感谢。