我有三张桌子:
作者
的 ID 命名
1 阿尔伯特
2 巴比
3 卡尔
4 丹
authors_musicals
的 ROWID 的 AUTHOR_ID 的 musical_id
1 1 1
2 2 1
3 1 2
4 1 3
音乐剧
的 ID 的标题 的年
1 Brigadoon 1947
2 My Lady Lady 1956
3 俄克拉荷马! 1943
4 柯莱特 1960
我需要获取属于Albert
的所有标题(作者的id
(1)对应musical_id
(1,2,3)在 authors_musicals 中,每个都对应于音乐剧中的title
(Brigadoon,My Fair Lady,Oklahoma!)。我认为以下内容可行:
SELECT title FROM musicals WHERE id=(SELECT musical_id FROM authors_musicals WHERE author_id=(SELECT id FROM authors WHERE name="Albert"));
这只给了我第一个上市。我怎样才能得到所有三个,因为这些表是相互关联的,有没有更简单的方法来获得我想要的东西?
答案 0 :(得分:2)
JOIN
表:
SELECT musicals.title
FROM musicals
JOIN authors_musicals ON (musicals.id = authors_musicals.musical_id)
JOIN authors ON (authors.id = authors_musicals.author_id)
WHERE authors.name = "Albert"
答案 1 :(得分:0)
我不使用SQLite,但我认为它与将SQL用于任何其他数据库基本相同。使用SomeColumn = SomeValue
时,右侧只能有一个值。即使您的子查询产生多个结果,也只会使用第一个,因为您使用的是=
。
假设SQLite支持该运算符,您应该能够通过将=
替换为IN
来保留当前的SQL结构并使其工作。然后你将与所有结果进行比较,而不只是一个。
那就是说,我认为你根本不应该使用子查询。在那里使用连接似乎更合适。同样,可能会有一些小的语法差异,但这样的事情应该有效:
SELECT title FROM musicals INNER JOIN authors_musicals
ON musicals.musical_id = authors_musicals.musical_id INNER JOIN authors
ON authors.author_id = authors_musicals.author_id
WHERE authors.name = 'Albert'
答案 2 :(得分:0)
结合表之间的信息并获得所需内容:
SELECT title
FROM authors, authors_musicals, musicals
WHERE name="Albert" and authors.id=authors_musicals.author_id and musical_id = musicals.id;