我有3个数据库表:site
,paper
和linkTable
。
idSite SiteName
--------------------
1 AAA
2 BBB
3 CCC
idPaper PaperName
------------------------
1 Paper1
2 Paper2
3 Paper3
4 Paper4
idLinkTable idSite idPaper
----------------------------------
1 1 1
2 1 3
3 2 1
我想展示所有没有idPaper=1
,idPaper=3
为idSite=1
的论文;同样对于idSite=2
,需要所有没有idPaper=1
的论文。这是必需的输出:
SiteName PaperName
------------------------
AAA Paper2
AAA Paper4
BBB Paper2
BBB Paper3
BBB Paper4
我试过这段代码:
SELECT s.SiteName AS Site, p.PaperName AS Paper
FROM site s
INNER JOIN linkTable l ON s.idSite = l.idSite
INNER JOIN paper p ON l.idPaper != p.idPaper;
这是我使用此代码时的结果:
SiteName PaperName
------------------------
AAA Paper2
AAA Paper3
AAA Paper4
AAA Paper1
AAA Paper2
AAA Paper4
BBB Paper2
BBB Paper3
BBB Paper4
你需要Site
和Paper
表之间所有可能的组合,除了那些已经存在于linkTable
中的表。使用CROSS JOIN获得所有可能的组合,并使用NOT EXISTS来消除linkTable
中已存在的结果。请尝试以下方法:
SELECT s.SiteName AS Site, p.PaperName AS Paper
FROM site s
CROSS JOIN paper p
WHERE NOT EXISTS ( SELECT idLinkTable FROM linkTable
WHERE linkTable.idSite = s.idSite
AND linkTable.idPaper = p.idPaper
)