【问题标题】:Sql INNER JOIN with SELECT state is throwing an error带有 SELECT 状态的 Sql INNER JOIN 抛出错误
【发布时间】:2012-01-09 04:25:33
【问题描述】:

我有两张桌子:

一个表是一个“目录”,其中存储了 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 个表。我需要从 table* 中提取数据,但我首先需要 tableLocation。 tableB 有 pageTitle。我需要连接这两个表才能获取该数据。

【问题讨论】:

  • 我知道我已经通过 p.tableLocation 获得了“tableLocation”。我尝试使用别名作为表名,但这引发了其他错误。
  • 从看起来你试图加入一个表本身,对吗?你想通过这样做来完成什么?此外,您收到 Invalid column name 错误的原因可能是您没有在子查询中选择 pageID 列。
  • 感谢安德斯。很抱歉这种格式。
  • 我有一个存储pageID、pageName的表(table1)和存储页面数据的表(table2)。我想从 tableLocation 指定连接的表中获取 pageID、pageName 和内容。我需要第二个 SELECT 作为“tableLocation”来获得我需要的东西。
  • 我用更多信息编辑了这个问题。布赖恩的建议似乎没有把我带到我想要的地方。

标签: sql database select inner-join


【解决方案1】:
(SELECT tableLocation 
 FROM pageCatalog 
 WHERE pageName='PAGENAME') AS d

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

你的意思是这样做:

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

【讨论】:

    【解决方案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'
    

    【讨论】:

      【解决方案3】:

      没有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' 
      

      【讨论】:

        【解决方案4】:

        您的子查询中没有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'
        

        【讨论】:

          【解决方案5】:

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

          尝试将其更改为:

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

          【讨论】:

            【解决方案6】:

            你有 -

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

            然后

            ON (p.pageID = d.pageID) 
            

            此时d 表将只包含tableLocation 列。

            【讨论】:

              【解决方案7】:

              您没有从子查询中选择 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';
              

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                  猜你喜欢
                  • 2011-10-25
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-03-03
                  • 1970-01-01
                  • 2012-04-02
                  • 2012-01-25
                  • 1970-01-01
                  • 2011-07-11
                  相关资源
                  最近更新 更多