使用join从SQL中的2个表中检索行

时间:2013-05-16 15:09:48

标签: mysql sql

SELECT * FROM movie_time AS a,movie_db AS b, movie_actor AS c
WHERE a.Movie_ID = b.Movie_ID AND b.Movie_ID=c.Movie_ID 
      AND c.Movie_ID = a.Movie_ID AND Movie_ID =17

您好我正在尝试使用join函数来检索正在工作的行,除非当我放入AND Movie_ID =17子句时我无法检索对应于{{的行1}}

我正在使用mySQL工作台。我是否也可以使用类似的语句来删除特定的retreived行?

错误:Movie_ID =17

4 个答案:

答案 0 :(得分:3)

您需要指定别名a.Movie_ID =17

SELECT * FROM movie_time AS a,movie_db AS b, movie_actor AS c
WHERE a.Movie_ID = b.Movie_ID AND b.Movie_ID=c.Movie_ID 
      AND c.Movie_ID = a.Movie_ID AND a.Movie_ID =17

对于删除(假设您要从movie_time表中删除):

DELETE
    a
FROM 
    movie_time AS a 
INNER JOIN movie_db AS b
    ON a.Movie_ID = b.Movie_ID
INNER JOIN movie_actor AS c
    ON c.Movie_ID = a.Movie_ID
WHERE 
    a.Movie_ID =17

答案 1 :(得分:1)

SELECT * FROM movie_time AS a,movie_db AS b, movie_actor AS c
WHERE a.Movie_ID = b.Movie_ID AND b.Movie_ID=c.Movie_ID 
      AND c.Movie_ID = a.Movie_ID AND a.Movie_ID =17

您尚未为Movie_ID = 17指定别名,从而导致歧义。 由于所有提到的表都有Movie_id列,因此在使用语句Movie_id = 17时,SQL无法决定您引用哪些表Movie_id列。 如果您想要表movie_time中的a.Movie_ID =17,请将其更改为Movie_id=17

作为旁注,您应该使用INNER JOIN来完成此操作。

答案 2 :(得分:1)

有关别名的答案是正确的。除了修复之外,我还要鼓励您使用ANSI连接,这将清除您的WHERE子句,并允许您从连接逻辑中拆分过滤逻辑(Movie_ID = 17WHERE子句中的其余噪声。

这与上面的查询相同:

SELECT * FROM movie_time AS a
  INNER JOIN movie_db AS b ON a.Movie_ID = b.Movie_ID
  INNER JOIN movie_actor AS c ON b.Movie_ID=c.Movie_ID
  WHERE a.Movie_ID =17

您不需要AND c.Movie_ID = a.Movie_ID的{​​{1}}部分,因为您已经WHERE通过a加入c

答案 3 :(得分:0)

这会返回比您需要的列更多的列,但请考虑这些行的语法...

SELECT * 
  FROM movie_time mt
  JOIN movie_db m
    ON m.Movie_ID = mt.Movie_ID 
  JOIN movie_actor ma
    ON ma.Movie_ID = m.Movie_ID
 WHERE m.Movie_ID = 17;

请注意,任何“无演员”电影都不会被退回!