在from子句中子查询内重用联接表中的字段



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

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,以便在子查询中进行日期比较,但当我执行查询时,我会弹出窗口或提示在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;

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

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新