在 FROM 子句中的子查询中重用联接的 table 中的字段

Reuse of a field from a joined table inside a subquery in FROM clause

以下查询并不是我真正使用的查询,但我的问题可以在这个更简单的查询中重现。基本上,我想要做的是在 FROM 子句中的子查询中使用或引用连接的 table 中的字段,就像这样。

SELECT t1.field1, t1.field2 - IIF(t3.calcfield is null, 0, 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 在子查询中进行日期比较,但是当我执行查询时,我得到弹出窗口 window 或提示在 t4.date.

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

尽管我的查询更复杂,但我用这样或更简单的简单查询复制了问题。

我尝试在 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, FIRST_NAME, LAST_NAME) VALUES ('2', 'Mike', 'Tyson'); 
INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('3', 'Bill', 'Keaton'); 
INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('4', 'Greg', 'Mercury'); 
INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('5', 'Steve', 'Jobs'); 
INSERT INTO sql_test_a (ID, FIRST_NAME, 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 table.

不存在

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

回想一下 SQL 的运算逻辑顺序,这与它的词汇顺序不同(即,它的书写顺序)。通常查询处理的第一步是FROM子句,然后是JOINONWHEREGROUP BY等,通常以[=18结束=] 和 SELECT(具有讽刺意味的是,虽然是先写的但最后处理的子句之一)。

从技术上讲,您的查询不涉及相关子查询,因为没有内部或外部级别。具体来说,派生tablet3和基础tablet4处于相同水平。查询引擎在 FROM 子句步骤中单独评估 t3。然后,它单独评估 JOIN table、t4,最后应用匹配的 ON 逻辑。

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

SELECT t1.field1, t1.field2 - IIF(t3.calcfield IS NULL, 0, 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

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

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

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

SELECT t1.field1, t1.field2 - IIF(t3.calcfield IS NULL, 0, t3.calc) As Diff
FROM my_saved_query t3
LEFT JOIN table4 t4 
   ON t3.fieldid = t4.fieldid