我做的数据存档从1模式到另一个模式在同一服务器上。我有Day0表(所有基本信息都在此表中维护),其中有Source_tableName,Dest_TableName,Date_Column(将运行存档),Retention_Period列以及Custom_Query列,我可以在其中加入表的一些数据。
现在我正在处理一个表,它有这个custom_query列,它的Join正在Destination表中创建多个记录。
案例1:尝试以下场景:
Insert into Dest_Table
SELECT a.* FROM Source_Table a, dual
WHERE EXISTS (SELECT distinct file_id FROM File_table b
WHERE a.fileid=b.cod_file_id AND TRUNC(DAT_UPLOAD) < '01-Jan-2018' );
但是我想关闭第一个条件后的括号,因为剩下的“AND TRUNC(FILE_UPLOAD)
“我是通过调用包在代码运行时从Day0表中获取的。但是DAT_UPLOAD列来自File_Table,因此我可能会得到ORA-00904: "DAT_UPLOAD"
:标识符无效。请帮我重新写一遍查询。我可以使用“File_table”来代替Dual吗?请注意,以下查询试图解决案例2,但由于关闭后台,其创建问题。查询方式:
Insert into Dest_Table
SELECT a.* FROM Source_Table a, dual
WHERE EXISTS (SELECT distinct file_id FROM File_table b
WHERE a.fileid=b.cod_file_id**)** AND TRUNC(DAT_UPLOAD) < '01-Jan-2018';
案例2:下面的查询创建了重复项。查询方式:
Insert into Dest_Table
SELECT a.* FROM Source_Table a, File_table b
WHERE a.fileid=b.cod_file_id AND TRUNC(DAT_UPLOAD) < '01-Jan-2018';
由于“File_table”有2个或多个行for cod_file_id和Source_Table有1行,但我只想用File_table验证数据,然后将其插入到Dest_table。
我希望我清楚地提到了我的怀疑。先谢了。
1条答案
按热度按时间v7pvogib1#
对dual的交叉联接不会增加行数,因为dual只有1行(任何整数乘以1 =原始整数)。所以你关于交叉联接的假设似乎是错误的,而且交叉联接对对偶也没有意义。
当使用EXISTS时,子查询select子句实际上没有任何作用,因此没有必要使用
select distinct file_id
这不会使您的查询更高效。实际上只有from & where子句在EXISTS中很重要,因为它们测试是否存在任何匹配的行。因此,您可以使用select null
或select 1
或select *
,并且不会改变整个查询的结果或性能。我不清楚你说的“* 但我想关闭第一个条件 * 之后的括号"是什么意思,如果DAT_UPLOAD在source_table(别名a)中,那么这样做:
正如在问题下的注解中所观察到的,在查询中不需要使用TRYST(),但是如果您还需要在结果中包含日期/时间值,例如
2018-01-01 15:42:56
,那么我建议您将筛选日期移动到date '2018-01-02'
还要注意,当使用EXISTS时,它也不会使查询的结果集相乘。因此,对dual的交叉连接不会使行相乘,使用EXISTS也不会,那么只留下Source_Table用于“重复或三重”。也许您还没有提供完整的查询,还有其他表正在连接?如果是这样的话,那么几乎可以肯定是这些连接增加了你的行。