情境:
我一直试图解决一个问题,我希望在两个表艺术家和专辑之间进行自然连接,其中艺术家组成一个列ar_id是主键,而专辑包含一列也是名为ar_id,其中Album表中的外键是ar_id,并引用艺术家ar_id。表之间有一对多的关系(一个艺术家可以有多个专辑)。
问题:
当我想在两个表Artists和Albums之间进行NATURAL JOIN时,它会返回0行,但是当我使用WHERE函数时,它是正常的JOIN,它会返回18行。所以我猜问题是外键设置,但我找不到问题
自然加入的选择代码(不起作用):
SELECT * FROM
Artists NATURAL JOIN Albums;
具有正常联接的选择代码(其中有效)
SELECT * FROM
Artists JOIN Albums
WHERE CDReg.Artists.ar_id = CDReg.Albums.ar_id;
两个表的DLL
CREATE TABLE Artists (
ar_id int PRIMARY KEY,
ge_id int(11) DEFAULT NULL,
country_code varchar(2) DEFAULT NULL,
name varchar(45) NOT NULL,
start_year year(4) DEFAULT NULL,
end_year year(4) DEFAULT NULL,
FOREIGN KEY (ge_id) REFERENCES Genres (ge_id),
FOREIGN KEY (country_code) REFERENCES Countries (code)
);
-- --------------------------------------------------------
CREATE TABLE Albums (
al_id int PRIMARY KEY,
ar_id int,
name varchar(45) NOT NULL,
release_year year(4) DEFAULT NULL,
FOREIGN KEY (ar_id) REFERENCES Artists(ar_id)
);
感谢提前的任何帮助:)
[解决]:的
我认为自然连接使用外键来连接表,而是使用所有匹配的列名,包括列" name
" (两个表中都存在),因为在数据库中没有任何具有同名专辑标题的艺术家,结果是0行。解决方案是使用
SELECT * FROM
Artists JOIN albums USING(ar_id);
答案 0 :(得分:0)
两个表的NATURAL [LEFT] JOIN被定义为语义 相当于INNER JOIN或带有USING子句的LEFT JOIN 名称两个表中都存在的所有列。
这两个表都有一个列document.getElementById('space' + i)
,它包含在自然连接中,除了那些艺术家和专辑名称相同(我猜可能会发生)之外的所有组合都失败。
您可以改为使用加入name
。
答案 1 :(得分:0)
自然联接可能会在联接中使用name
,这会导致0结果,除非艺术家有同名专辑!
无论如何你应该avoid natural join,因为正如你所看到的,它们不太明显。坚持正常的加入版本。