使用内部联接查询三个表

时间:2014-06-18 22:39:39

标签: sql inner-join

我正在使用三个表处理sql数据库。

PageIds 链接 行列

我想用页面名称查询数据库并找到给定页面名称的所有链接,而且我想获得按分数排序的链接。

用于查询的PageName存在为PageA或PageB,如果是PageA,那么我需要PageBs PageName和PageBs PageScore - 反之亦然。

我知道我必须使用内连接,但我应该如何处理'或'在内部联接中如何在PageId中获取PageId,在PageIds中查询其他表然后查询PageName。

这是我尝试过的,但需要一段时间,然后我不会得到相反的PageName

select * from PageIds 
inner join Links
on Links.PageAId = PageIds.PageId or Links.PageBId = PageIds.PageId
inner join Ranks 
on Ranks.PageId = Links.PageBId
where PageIds.PageName = @searchternm

PageIds

为PageName匹配@searchterm

获取PageId
+--------+----------+
| PageId | PageName |
+--------+----------+
|   1234 | NameA    |
|   4321 | NameB    |
|   3321 | NameC    |
+--------+----------+

链接

如果之前找到PageId = PageAId, 然后为PageBId获取PageBId和PageName, 否则获取PageAId的PageAId和PageName

+---------+---------+
| PageAId | PageBId |
+---------+---------+
|    1234 |    3321 |
|    4321 |    3321 |
|    1234 |    4321 |
+---------+---------+

排名

如果之前找到PageId = PageAId, 然后获得PageBId的分数, 否则获得PageAId的分数

+--------+-----------+
| PageId | PageScore |
+--------+-----------+
|   1234 |      1    |
|   3321 |      4    |
|   4321 |      2    |
+--------+-----------+

如果输入是NameB,则输出应为:

PageName, Score

NodeC, 4
NodeA, 1

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的要求,您将要加入PageIDs表两次,一次作为PageAID,一次作为PageBID。

然后有一个查询选择pageB详细信息,其中pageB匹配,然后将其与页面A匹配的pageB详细信息的反向查询联合。

SELECT PageA.PageName, RanksA.Score FROM Links
INNER JOIN PageIDs [PageA] on Links.PageAID = PageA.PageID
INNER JOIN PageIDs [PageB] on Links.PageBID = PageB.PageID
INNER JOIN Ranks [RanksA] on Links.PageAID = RanksA.PageID
WHERE PageB.PageName = @PageName
UNION 
SELECT PageB.PageName, RanksB.Score FROM Links
INNER JOIN PageIDs [PageA] on Links.PageAID = PageA.PageID
INNER JOIN PageIDs [PageB] on Links.PageBID = PageB.PageID
INNER JOIN Ranks [RanksB] on Links.PageBID = RanksB.PageID
WHERE PageA.PageName = @PageName