交叉连接在Oracle SQL中创建重复项、三重项等

sqxo8psd  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(95)

我做的数据存档从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。
我希望我清楚地提到了我的怀疑。先谢了。

v7pvogib

v7pvogib1#

对dual的交叉联接不会增加行数,因为dual只有1行(任何整数乘以1 =原始整数)。所以你关于交叉联接的假设似乎是错误的,而且交叉联接对对偶也没有意义。
当使用EXISTS时,子查询select子句实际上没有任何作用,因此没有必要使用select distinct file_id这不会使您的查询更高效。实际上只有from & where子句在EXISTS中很重要,因为它们测试是否存在任何匹配的行。因此,您可以使用select nullselect 1select *,并且不会改变整个查询的结果或性能。

SELECT a.*
FROM Source_Table a
WHERE EXISTS (
        SELECT 1 -- I prefer select null, but the choice is just a personal preference here
        FROM File_table b
        WHERE a.fileid = b.cod_file_id
            AND b.DAT_UPLOAD < date '2018-01-01' -- assumes DAT_UPLOAD is from b and is date or timestamp
        );

我不清楚你说的“* 但我想关闭第一个条件 * 之后的括号"是什么意思,如果DAT_UPLOAD在source_table(别名a)中,那么这样做:

SELECT a.*
FROM Source_Table a
WHERE EXISTS (
        SELECT 1 -- I prefer select null, you can use select * if you prefer
        FROM File_table b
        WHERE a.fileid = b.cod_file_id
        )
 AND a.DAT_UPLOAD < date '2018-01-01' -- assumes DAT_UPLOAD is from a and is date or timestamp

正如在问题下的注解中所观察到的,在查询中不需要使用TRYST(),但是如果您还需要在结果中包含日期/时间值,例如2018-01-01 15:42:56,那么我建议您将筛选日期移动到date '2018-01-02'
还要注意,当使用EXISTS时,它也不会使查询的结果集相乘。因此,对dual的交叉连接不会使行相乘,使用EXISTS也不会,那么只留下Source_Table用于“重复或三重”。也许您还没有提供完整的查询,还有其他表正在连接?如果是这样的话,那么几乎可以肯定是这些连接增加了你的行。

相关问题