带有SELECT状态的Sql INNER JOIN正在抛出错误

时间:2011-11-29 20:37:22

标签: sql database select inner-join

我有两张桌子:

一个表是存储pageID,tableLocation和pageName的“目录”。

tableLocation是存储该页面内容的地方(我有多个网站区域......无论如何)。

我需要从“tableLocation”获取数据,所以我想做一个JOIN,这样我就可以获得目录和所需表格所需的所有数据。当然,如果没有“tableLocation”数据,我不知道要查看哪个表。我正在尝试使用以下SQL语句:

SELECT p.pageID,p.tableLocation,p.pageName 
FROM pageCatalog p 
INNER JOIN 
(SELECT tableLocation 
 FROM pageCatalog 
 WHERE pageName='PAGENAME') d 
ON (p.pageID = d.pageID) 
WHERE p.pageName='PAGENAME'

我收到错误消息“无效的列名'pageID'”

如果我用特定的tableLocation替换第二个SELECT,它就可以工作。所以错误是“INNER JOIN(SELECT ...”),但我不确定问题是什么。有什么想法吗?

-------------编辑---------- 更多细节:

例如pageCatalog有这个

    pageID  tableLocation   pageName
    167     tableA          page1
    12      tableB          page2
    250     tableC          page3

在这个例子中我有3个表。我需要从表*中提取数据,但我首先需要tableLocation。 tableB有pageTitle。我需要加入这两个表来获取数据。

8 个答案:

答案 0 :(得分:3)

(SELECT tableLocation 
 FROM pageCatalog 
 WHERE pageName='PAGENAME') AS d

我没有看到名为pageID的列,但您引用了d.pageID

你的意思是这样做:

(SELECT pageID 
 FROM pageCatalog 
 WHERE pageName='PAGENAME') AS d

答案 1 :(得分:2)

在内部SELECT中,您只选择tableLocation列,但之后尝试将pageID列称为d.pageID。尝试将该列添加到内部SELECT:

SELECT p.pageID,p.tableLocation,p.pageName 
FROM pageCatalog p 
INNER JOIN 
(SELECT tableLocation, pageID
 FROM pageCatalog 
 WHERE pageName='PAGENAME') d 
ON (p.pageID = d.pageID) 
WHERE p.pageName='PAGENAME'

答案 2 :(得分:1)

没有d.pageID。您的子查询别名d只有一列tableLocation。修改它,如下所示:

SELECT p.pageID,p.tableLocation,p.pageName  
FROM pageCatalog p  
INNER JOIN  
(SELECT pageID, tableLocation 
 FROM pageCatalog  
 WHERE pageName='PAGENAME') d  
ON (p.pageID = d.pageID)  
WHERE p.pageName='PAGENAME' 

答案 3 :(得分:1)

您的子查询中没有pageID。将其更改为:

SELECT p.pageID,p.tableLocation,p.pageName 
FROM pageCatalog p 
INNER JOIN 
(SELECT tableLocation, pageID 
 FROM pageCatalog 
 WHERE pageName='PAGENAME') d 
ON (p.pageID = d.pageID) 
WHERE p.pageName='PAGENAME'

答案 4 :(得分:1)

您的子选择别名d不包含pageID

尝试将其更改为:

INNER JOIN 
(SELECT tableLocation, pageID 
 FROM pageCatalog 
 WHERE pageName='PAGENAME') d 
ON (p.pageID = d.pageID) 

答案 5 :(得分:1)

你有 -

(SELECT tableLocation FROM pageCatalog WHERE pageName='PAGENAME') d

然后

ON (p.pageID = d.pageID) 

此时d表格仅包含列tableLocation

答案 6 :(得分:1)

您没有从子查询中选择pageID。试试这个:

SELECT p.pageID,p.tableLocation,p.pageName 
FROM pageCatalog p 
INNER JOIN 
(SELECT tableLocation, pageID
 FROM pageCatalog 
 WHERE pageName='PAGENAME') d 
ON (p.pageID = d.pageID) 
WHERE p.pageName='PAGENAME'

或者更好的是,根本不要使用子查询:

SELECT p.pageID, p.tableLocation, p.pageName 
FROM pageCatalog p 
INNER JOIN pageCatalog d
ON p.pageID = d.pageID
WHERE p.pageName='PAGENAME'
AND d.pageName = 'PAGENAME';

答案 7 :(得分:0)

我刚刚做了两个查询语句。首先将tableLocation存储为变量,第二个查询将第二个SELECT替换为变量。我想避免两个查询,但没有找到方法。