使用 FROM 子句中的子查询进行联接操作中的 SQL 语法错误

Posted

技术标签:

【中文标题】使用 FROM 子句中的子查询进行联接操作中的 SQL 语法错误【英文标题】:SQL Syntax Error in Join Operation with Subquery in FROM clause 【发布时间】:2018-10-25 08:19:40 【问题描述】:

我一直在抨击这个问题,我相信这是一个超级简单的答案。在 Excel 2016 VBA 中,我有以下 SQL 字符串,但在连接操作中出现语法错误。

SELECT c.code, p.description, p.weight, p.[pack size], p.ppb, p.[CP-UK], p.[CP-EU]
FROM((
    SELECT *
        FROM [Catalogue Info] as c
        LEFT JOIN [Product Information] as p on c.code = p.code
    )
    LEFT JOIN [;database=C:\mypath\db.accdb;PWD=1234].tbl as pl on c.code = pl.product_code
    )
WHERE c.Category = 'VIENNOISERIE'
AND c.Sub_Cat_1 = 'CROISSANTS'
AND c.Sub_Cat_2 = ''
AND p.active = true
ORDER BY c.Page ASC, c.Page_Position ASC;

我尝试在子查询中使用第二个 LEFT JOIN,但我在 SELECT 子句中很难引用它。

有什么想法吗?

【问题讨论】:

你需要使用别名 @Sami 我一直在使用别名,你的意思是什么? 您的发件人没有别名 这里需要别名) --here LEFT JOIN 回答@Sami 【参考方案1】:

我会这样认为,

SELECT j.code, j.description, j.weight, j.[pack size], j.ppb, j.[CP-UK], j.[CP-EU]
FROM(
    SELECT c.code, p.description, p.weight, p.[pack size], p.ppb, p.[CP-UK], p.[CP-EU],
c.Category,c.Sub_Cat_1,c.Sub_Cat_2,p.active,c.Page,c.Page_Position
        FROM [Catalogue Info] as c
        LEFT JOIN [Product Information] as p on c.code = p.code
    )j
    LEFT JOIN [;database=C:\mypath\db.accdb;PWD=1234].tbl as pl on j.code = pl.product_code

WHERE j.Category = 'VIENNOISERIE'
AND j.Sub_Cat_1 = 'CROISSANTS'
AND j.Sub_Cat_2 = ''
AND j.active = true
ORDER BY j.Page ASC, j.Page_Position ASC;

【讨论】:

感谢您的回复。我现在收到一个错误“指定的字段 j.code 可以引用您的 SQL 语句的 FROM 子句中列出的多个表” 而不是子查询中的全选 j 选择 c.code 或 p.code 在这种情况下我需要选择所有其他列吗? 当然,兄弟编码愉快【参考方案2】:

假设您查询外部数据库的方式是正确的语法

    SELECT c.code, p.description, p.weight, p.[pack size], p.ppb, p.[CP-UK], p.[CP-EU]
        FROM [Catalogue Info] as c
        LEFT JOIN [Product Information] as p on c.code = p.code
    LEFT JOIN [;database=C:\mypath\db.accdb;PWD=1234].tbl as pl on c.code = pl.product_code
WHERE c.Category = 'VIENNOISERIE'
AND c.Sub_Cat_1 = 'CROISSANTS'
AND c.Sub_Cat_2 = ''
AND p.active = true
ORDER BY c.Page ASC, c.Page_Position ASC;

另外,为什么在SELECT 语句中不使用外部数据库(.tbl as pl)?

【讨论】:

外部数据库的语法是正确的,但在 SELECT 语句中使用它会导致其他问题,因此在我修复此问题时暂时删除。【参考方案3】:

使用下面的代码

SELECT c.code, p.description, p.weight, p.[pack size], p.ppb, p.[CP-UK], p.[CP-EU]
FROM((
    SELECT *
        FROM [Catalogue Info] as c
        LEFT JOIN [Product Information] as p on c.code = p.code
    ) as t
    LEFT JOIN [;database=C:\mypath\db.accdb;PWD=1234].tbl as pl on t.code = pl.product_code
    ) as t1
WHERE t1.Category = 'VIENNOISERIE'
AND t1.Sub_Cat_1 = 'CROISSANTS'
AND t1.Sub_Cat_2 = ''
AND pactive = true
ORDER BY Page ASC, Page_Position ASC;

【讨论】:

以上是关于使用 FROM 子句中的子查询进行联接操作中的 SQL 语法错误的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的子查询中FROM和EXISTS子句的使用教程

使用 from 子句中的子查询动态选择表名

Psql - from 子句中的子查询 - 不好的做法?

View 的 SELECT 包含 FROM 子句中的子查询

在 MS Query 中使用多个 INNER JOIN 的 FROM 子句中的子查询的语法

带有联合错误的 MySQL 视图 - “视图的 SELECT 包含 FROM 子句中的子查询”