SQL的内部联接导致重复条目,即使所有3个表中都没有重复的列值
关于URL上的第一个问题:,请用SQL编写一个查询,列出在电影《安妮·霍尔》中扮演角色的演员的所有信息。有人能解释一下,为什么下面的查询会导致重复条目,即使三个表中的每个表中都没有重复的id列值:actor、movie\u cast和movie SQL查询:SQL的内部联接导致重复条目,即使所有3个表中都没有重复的列值,sql,inner-join,Sql,Inner Join,关于URL上的第一个问题:,请用SQL编写一个查询,列出在电影《安妮·霍尔》中扮演角色的演员的所有信息。有人能解释一下,为什么下面的查询会导致重复条目,即使三个表中的每个表中都没有重复的id列值:actor、movie\u cast和movie SQL查询: SELECT actor.act_id, actor.act_fname, actor.act_lname, actor.act_gender FROM actor INNER JOIN movie_cast ON actor.act_id
SELECT actor.act_id, actor.act_fname, actor.act_lname, actor.act_gender
FROM actor
INNER JOIN movie_cast ON actor.act_id = movie_cast.act_id
INNER JOIN movie ON movie_cast.mov_id = movie.mov_id
WHERE movie.mov_title = 'Annie Hall'
上述查询对w3resource的输出为:
act_id act_fname act_lname act_gender
111 Woody Allen M
111 Woody Allen M
3个表格的样本:
演员:
act_id | act_fname | act_lname | act_gender
--------+----------------------+----------------------+------------
101 | James | Stewart | M
102 | Deborah | Kerr | F
103 | Peter | OToole | M
104 | Robert | De Niro | M
105 | F. Murray | Abraham | M
106 | Harrison | Ford | M
107 | Nicole | Kidman | F
108 | Stephen | Baldwin | M
109 | Jack | Nicholson | M
110 | Mark | Wahlberg | M
111 | Woody | Allen | M
112 | Claire | Danes | F
113 | Tim | Robbins | M
114 | Kevin | Spacey | M
115 | Kate | Winslet | F
116 | Robin | Williams | M
117 | Jon | Voight | M
118 | Ewan | McGregor | M
119 | Christian | Bale | M
120 | Maggie | Gyllenhaal | F
121 | Dev | Patel | M
122 | Sigourney | Weaver | F
123 | David | Aston | M
124 | Ali | Astin | F
电影演员:
act_id | mov_id | role
--------+--------+--------------------------------
101 | 901 | John Scottie Ferguson
102 | 902 | Miss Giddens
103 | 903 | T.E. Lawrence
104 | 904 | Michael
105 | 905 | Antonio Salieri
106 | 906 | Rick Deckard
107 | 907 | Alice Harford
108 | 908 | McManus
110 | 910 | Eddie Adams
111 | 911 | Alvy Singer
112 | 912 | San
113 | 913 | Andy Dufresne
114 | 914 | Lester Burnham
115 | 915 | Rose DeWitt Bukater
116 | 916 | Sean Maguire
117 | 917 | Ed
118 | 918 | Renton
120 | 920 | Elizabeth Darko
121 | 921 | Older Jamal
122 | 922 | Ripley
114 | 923 | Bobby Darin
109 | 909 | J.J. Gittes
119 | 919 | Alfred Borden
电影:
mov_id | mov_title | mov_year | mov_time | mov_lang | mov_dt_rel | mov_rel_country
--------+----------------------------------------------------+----------+----------+-----------------+------------+-----------------
901 | Vertigo | 1958 | 128 | English | 1958-08-24 | UK
902 | The Innocents | 1961 | 100 | English | 1962-02-19 | SW
903 | Lawrence of Arabia | 1962 | 216 | English | 1962-12-11 | UK
904 | The Deer Hunter | 1978 | 183 | English | 1979-03-08 | UK
905 | Amadeus | 1984 | 160 | English | 1985-01-07 | UK
906 | Blade Runner | 1982 | 117 | English | 1982-09-09 | UK
907 | Eyes Wide Shut | 1999 | 159 | English | | UK
908 | The Usual Suspects | 1995 | 106 | English | 1995-08-25 | UK
909 | Chinatown | 1974 | 130 | English | 1974-08-09 | UK
910 | Boogie Nights | 1997 | 155 | English | 1998-02-16 | UK
911 | Annie Hall | 1977 | 93 | English | 1977-04-20 | USA
912 | Princess Mononoke | 1997 | 134 | Japanese | 2001-10-19 | UK
913 | The Shawshank Redemption | 1994 | 142 | English | 1995-02-17 | UK
914 | American Beauty | 1999 | 122 | English | | UK
915 | Titanic | 1997 | 194 | English | 1998-01-23 | UK
916 | Good Will Hunting | 1997 | 126 | English | 1998-06-03 | UK
917 | Deliverance | 1972 | 109 | English | 1982-10-05 | UK
918 | Trainspotting | 1996 | 94 | English | 1996-02-23 | UK
919 | The Prestige | 2006 | 130 | English | 2006-11-10 | UK
920 | Donnie Darko | 2001 | 113 | English | | UK
921 | Slumdog Millionaire | 2008 | 120 | English | 2009-01-09 | UK
922 | Aliens | 1986 | 137 | English | 1986-08-29 | UK
923 | Beyond the Sea | 2004 | 118 | English | 2004-11-26 | UK
924 | Avatar | 2009 | 162 | English | 2009-12-17 | UK
926 | Seven Samurai | 1954 | 207 | Japanese | 1954-04-26 | JP
927 | Spirited Away | 2001 | 125 | Japanese | 2003-09-12 | UK
928 | Back to the Future | 1985 | 116 | English | 1985-12-04 | UK
925 | Braveheart | 1995 | 178 | English | 1995-09-08 | UK
您的电影演员表中有演员伍迪·艾伦的重复条目。您可以使用下面的查询进行检查。您可以在下图中看到输出,因此您在查询中得到两条记录。如果要消除重复条目,请在查询中尝试使用DISTINCT
SELECT *
FROM movie_cast
WHERE movie_cast.act_id = 111
具有不同记录的查询
SELECT DISTINCT actor.act_id, actor.act_fname, actor.act_lname, actor.act_gender
FROM actor
INNER JOIN movie_cast ON actor.act_id = movie_cast.act_id
INNER JOIN movie ON movie_cast.mov_id = movie.mov_id
WHERE movie.mov_title = 'Annie Hall'
OP的问题来自评论
但是,为什么建议的解决方案没有产生任何重复?建议的解决方案:从演员中选择*从电影中选择演员id从电影中选择演员id从电影中选择电影id从电影中选择电影id从电影中选择电影id从电影中选择电影标题='Annie Hall' 答复
因为内部查询将有一个由重复的mov\u id组成的列表。但外部查询只会为每条记录检查一次内部查询结果是否包含当前行的mov\u id。请。从其他文本中转述或引用。给出你所需要的&把它和你的问题联系起来。仅将图像用于不能表示为文本或扩充文本的内容。无法搜索或剪切粘贴图像。包括带有图像的图例/图例和说明。而且,链接也会消失。使用编辑功能插入图像/链接。请在代码问题中给出一个剪切、粘贴和可运行的代码,包括作为代码输入的最小代表性示例;期望和实际输出,包括逐字记录错误消息;标签和版本;清晰的说明和解释。给出你能给出的最少代码,即你显示的代码是OK的,扩展为你显示的代码是不OK的。调试基础。对于包含DBMS和DDL(包括约束和索引)的SQL,请输入格式化为表的代码。解释你的期望以及你期望它的原因。否则答案就是,因为SQL就是这样定义的。谢谢Karan!我想知道,如果3个示例表在id列下没有显示任何内容,那么3个表中的任何一个都可能存在重复项。然而,当我按演员id从电影演员顺序中选择*时,我意识到每个不同的条目都是成对的!我想我没有按照字面意思理解示例单词。DISTINCT通常是解决重复行的最糟糕方法,因为人们往往会过度使用它,而不是找到重复行的根本原因。但是,在这种情况下,很明显,表的声明很糟糕,因为表上没有键,因此无法使用更好的工具来解决重复问题。为什么建议的解决方案不会导致任何重复?建议的解决方案:从演员中选择*从电影中选择演员id从电影中选择演员id从电影中选择电影id从电影中选择电影id从电影中选择电影id从电影中选择电影标题='Annie Hall';我已经更新了你问题的答案。请检查在这种情况下什么是内部查询和外部查询?