Oracle从查询中选择其他查询中不存在的行

时间:2019-04-14 19:16:45

标签: oracle join plsql

让我解释一下这个问题。

我有两个表,其中有3列具有相同的数据类型。如果您愿意,这3列会创建一个键/ ID,但是表中的列名称是不同的。 现在,我用这两个表的这3列创建查询。我设法独立获得了这些结果

例如:

SELECT ID, FirstColumn, sum(SecondColumn)
    FROM (SELECT ABC||DEF||GHI AS ID, FirstTable.* 
            FROM FirstTable
            WHERE ThirdColumn = *1st condition*)
GROUP BY ID, FirstColumn
;

SELECT ID, SomeColumn, sum(AnotherColumn)
    FROM (SELECT JKM||OPQ||RST AS ID, SecondTable.* 
            FROM SecondTable 
            WHERE AlsoSomeColumn  = *2nd condition*)
GROUP BY ID, SomeColumn
;

因此,我对两个不同的表进行了非常相似的查询。我知道结果具有一定数量的具有ID属性的相同行,这是我刚刚在查询中创建的行。我需要检查结果中的哪些行不在另一个查询的结果中,反之亦然。

我必须从查询中创建临时表或视图吗?也许以特定的方式将两个表联接在一起,并且只对它们运行一个查询?

作为初学者,我对如何将结果用作下一个查询的输入没有任何经验。我很感兴趣什么是最干净,最优雅的方法。

1 个答案:

答案 0 :(得分:3)

不,您很可能不需要任何“临时”表。 WITH析因子句会有所帮助。

这是一个例子:

library(dplyr)
library(stringr)

data.frame(
  genre = c('Action', 'Fantasy|Action', 'Animation|Fantasy')
) %>% 
  mutate(
    isAction    = grepl('Action', genre),
    isAdventure = grepl('Adventure', genre),
    isAnimation = grepl('Animation', genre),
    isComedy    = grepl('Comedy', genre),
    isFantasay  = grepl('Fantasy', genre)
  )

#               genre isAction isAdventure isAnimation isComedy isFantasay
# 1            Action     TRUE       FALSE       FALSE    FALSE      FALSE
# 2    Fantasy|Action     TRUE       FALSE       FALSE    FALSE       TRUE
# 3 Animation|Fantasy    FALSE       FALSE        TRUE    FALSE       TRUE

要获得另一个结果,您只需切换表格即可,例如

with 
first_query as
  (select id, first_column, ...
     from (select ABC||DEF||GHI as id, ...)
  ),
second_query as
  (select id, some_column, ...
     from (select JKM||OPQ||RST as id, ...)
  )
select id from first_query
minus
select id from second_query;