在 FROM 子句中的子查询内重用连接表中的字段

问题描述

以下查询不是我真正使用的查询,但我的问题可以在这个更简单的查询中复制。基本上,我想要做的是在子查询中使用或引用连接表中的字段,该子查询位于 FROM 子句中,如下所示。

SELECT t1.field1,t1.field2 - IIF(t3.calcfield is null,t3.calc)
FROM
  (SELECT t2.fieldid,SUM(t2.field3) AS fsum
   FROM t2
   WHERE t2.date > t4.date 
   GROUP BY t2.fieldid) t3
LEFT JOIN
  table4 t4 ON t3.fieldid = t4.fieldid

我需要使用的字段是 t4.date 来在子查询中进行日期比较,但是当我执行查询时,我会看到弹出窗口或提示t4.date 中输入一个值。>

我只是想对过滤进行比较,以便我可以在外部 fsum 语句中使用 SELECT 字段。我认为就我想要实现的目标而言,该查询非常容易理解。

即使我的查询更复杂,我还是用像这样或更简单的简单查询重现了问题。

我尝试在 AQL 沙箱网页中复制它:https://sqltest.net/。沙箱生成的表,右上角我选择了Oracle数据库

表格:

CREATE TABLE sql_test_a 
( 
    ID         VARCHAR2(4000 BYTE),FirsT_NAME VARCHAR2(200 BYTE),LAST_NAME  VARCHAR2(200 BYTE) 
); 

CREATE TABLE sql_test_b 
( 
    ID         VARCHAR2(4000 BYTE) 
); 

INSERT INTO sql_test_a (ID,FirsT_NAME,LAST_NAME) VALUES ('1','John','SNow'); 
INSERT INTO sql_test_a (ID,LAST_NAME) VALUES ('2','Mike','Tyson'); 
INSERT INTO sql_test_a (ID,LAST_NAME) VALUES ('3','Bill','Keaton'); 
INSERT INTO sql_test_a (ID,LAST_NAME) VALUES ('4','Greg','Mercury'); 
INSERT INTO sql_test_a (ID,LAST_NAME) VALUES ('5','Steve','Jobs'); 
INSERT INTO sql_test_a (ID,LAST_NAME) VALUES ('6','Johhny','Depp');

我写的sql代码如下:

SELECT T1.ID,TINNER.FirsT_NAME
FROM 
  (SELECT T2.ID FROM sql_test_b T2
   WHERE T1.FirsT_NAME LIKE 'greg') TINNER
INNER JOIN
  sql_test_a T1 ON t1.ID = TINNER.ID;

我实际上遇到了相同的错误或问题,即内部子查询T1 表不存在 TINNER 字段。

我使用的是 Microsoft Access 2003。(只是因为我以前使用过)。

解决方法

回忆 SQL 与其词法顺序不同的操作逻辑顺序(即,它的编写顺序)。通常查询处理的第一步是FROM子句,然后是JOINONWHEREGROUP BY等,通常以{{1}结尾}} 和 ORDER BY(具有讽刺意味的是,虽然是最先写的但最后处理的子句之一)。

从技术上讲,您的查询不涉及相关子查询,因为没有内部或外部级别。具体来说,派生表SELECT和基表t3处于相同级别。查询引擎在 t4 子句步骤期间自行评估 t3。然后,它单独评估 FROMJOIN,最后应用匹配的 t4 逻辑。

由于 ON 的 Universe 中未定义 t4,因此通过 GUI 的 MS Access 会提示输入该参数值(其中通过 ODBC 的 MS Access 将引发错误)。要解决此问题,您必须在每个表范围内包含所有必要的数据源:

t3

通常,在 Access 中使用分层查询也是有益的,并且可以帮助完成最终的、紧凑的查询:

SELECT t1.field1,t1.field2 - IIF(t3.calcfield IS NULL,t3.calc) As Diff FROM (SELECT t2.fieldid,SUM(t2.field3) AS fsum FROM t2 INNER JOIN table4 sub_t4 ON t2.fieldid = sub_t4.fieldid WHERE t2.date > sub_t4.date GROUP BY t2.fieldid ) t3 LEFT JOIN table4 t4 ON t3.fieldid = t4.fieldid 查询 (在下面保存为查询对象)

t3

最终查询 (加入保存的查询)

SELECT t2.fieldid,SUM(t2.field3) AS fsum
FROM t2
INNER JOIN table4 sub_t4
   ON t2.fieldid = sub_t4.fieldid
WHERE t2.date > sub_t4.date 
GROUP BY t2.fieldid

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...