sqldf 中的多个连接,包括完全连接

Multiple joins in sqldf, including a full join

我需要 运行 使用 sqldf 进行多重连接查询。我有一个用 SQL 编写的原始代码,必须在 R 中复制,所以我正在使用 sqldf。我的问题是,在嵌套连接中,有一个 FULL JOIN,而 sqldf 仍然不支持 FULL JOIN。所以我正在寻找解决方法。

我的嵌套连接是一个完整连接,然后是一个左连接。我的解决方案是从查询中取出完整连接,运行 它,以及结果数据集,运行 下一个左连接。原始代码说:

select
  i1.ID as id1, 
  i2.ID as id2,
  i3.type
  from Blad1 i1 
  full join Blad2 ii3 on i1.ID_pers = ii3.ID_pers_1
  left join Blad1 i2 on ii3.ID_pers_2 = i2.Id_pers 
  left join Blad1 i3 on i1.ID_pers = i3.Id_pers
  where i1.Type = 'OCCUPATION'

我的解决方案是 运行 与 dplyr 函数完全连接 full_join:

fulljoin <- full_join(Blad1, Blad2, by = c("ID_pers" = "ID_pers_1"))

然后,查询:

B <- sqldf ("select
             i1.ID as id1, 
             i2.ID as id2,
             i3.type
             from fulljoin i1
             left join INDIVI i2 on i1.ID_pers_2 = i2.Id_pers
             left join Blad1 i3 on i1.ID_pers = i3.Id_pers
             where i1.Type = 'OCCUPATION'")

两组数据为:

Blad1

ID  ID_D      ID_pers   SOURCE           TYPE        VALUE
1   STANDARD    1   PARISH RECORD   ARRIVAL_FROM    Bijmeer
2   STANDARD    2   PARISH RECORD   OCCUPATION      Almere
3   STANDARD    2   PARISH RECORD   ARRIVAL_FROM    WISKUNDE
4   STANDARD    3   PARISH RECORD   OCCUPATION      BILDERDIJK
5   STANDARD    4   PARISH RECORD   ARRIVAL_FROM    Enschede

Blad2

ID      ID_D    ID_pers_1   ID_pers_2   RELATION
933104  STANDARD    4        2021643    Father
1478    STANDARD    4        1          Child
1664    STANDARD    2118979  2021107     Child
6918    STANDARD    2481830  2          Child
7088    STANDARD    2        2011817     Child
1268853 STANDARD    1        3          Mother

问题是我的解决方案无法正常工作,因为左连接使用 table Blad 2

后的原始子句
(ii3.ID_pers_2 = i2.Id_pers), 

而我的解决方案,对于同一个子句,我只能使用 Full Join 结果 table

(i1.ID_pers_2 = i2.Id_pers)

这两个条件不一样,所以两个left join的结果不一样,嵌套的查询也不一样,最后的结果也不一样。

任何提示,欢迎。

感谢您的阅读。

sqldf 支持 4 个后端,而 PostgreSQL 后端支持完全连接。

将您的代码修改为如下内容:

library(RPostgreSQL)
library(sqldf)

sqldf('
  select
    i1."ID" as id1, 
    i2."ID" as id2
  from "Blad1" i1 
    full join "Blad2" ii3 on i1."ID_pers" = ii3."ID_pers_1"
    left join "Blad1" i2 on ii3."ID_pers_2" = i2."ID_pers"
  where i1."TYPE" = \'OCCUPATION\'
')

?sqldfFAQ 12 中有更多关于将 PostgreSQL 与 sqldf 结合使用的信息。如何将 sqldf 与 PostgreSQL 结合使用?sqldf github page .

另一种方法是使用默认值模拟完全联接。查看 sqlite 后端:http://www.sqlitetutorial.net/sqlite-full-outer-join/ or FULL OUTER JOIN with SQLite