当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R dbplyr join.tbl_sql 连接 SQL 表


这些是 dplyr join 泛型的方法。它们被转换为以下 SQL 查询:

  • inner_join(x, y)SELECT * FROM x JOIN y ON x.a = y.a

  • left_join(x, y) : SELECT * FROM x LEFT JOIN y ON x.a = y.a

  • right_join(x, y)SELECT * FROM x RIGHT JOIN y ON x.a = y.a

  • full_join(x, y) : SELECT * FROM x FULL JOIN y ON x.a = y.a

  • semi_join(x, y) : SELECT * FROM x WHERE EXISTS (SELECT 1 FROM y WHERE x.a = y.a)

  • anti_join(x, y) : SELECT * FROM x WHERE NOT EXISTS (SELECT 1 FROM y WHERE x.a = y.a)

用法

# S3 method for tbl_lazy
inner_join(
  x,
  y,
  by = NULL,
  copy = FALSE,
  suffix = NULL,
  ...,
  keep = NULL,
  na_matches = c("never", "na"),
  multiple = NULL,
  unmatched = "drop",
  sql_on = NULL,
  auto_index = FALSE,
  x_as = NULL,
  y_as = NULL
)

# S3 method for tbl_lazy
left_join(
  x,
  y,
  by = NULL,
  copy = FALSE,
  suffix = NULL,
  ...,
  keep = NULL,
  na_matches = c("never", "na"),
  multiple = NULL,
  unmatched = "drop",
  sql_on = NULL,
  auto_index = FALSE,
  x_as = NULL,
  y_as = NULL
)

# S3 method for tbl_lazy
right_join(
  x,
  y,
  by = NULL,
  copy = FALSE,
  suffix = NULL,
  ...,
  keep = NULL,
  na_matches = c("never", "na"),
  multiple = NULL,
  unmatched = "drop",
  sql_on = NULL,
  auto_index = FALSE,
  x_as = NULL,
  y_as = NULL
)

# S3 method for tbl_lazy
full_join(
  x,
  y,
  by = NULL,
  copy = FALSE,
  suffix = NULL,
  ...,
  keep = NULL,
  na_matches = c("never", "na"),
  multiple = NULL,
  sql_on = NULL,
  auto_index = FALSE,
  x_as = NULL,
  y_as = NULL
)

# S3 method for tbl_lazy
cross_join(
  x,
  y,
  ...,
  copy = FALSE,
  suffix = c(".x", ".y"),
  x_as = NULL,
  y_as = NULL
)

# S3 method for tbl_lazy
semi_join(
  x,
  y,
  by = NULL,
  copy = FALSE,
  ...,
  na_matches = c("never", "na"),
  sql_on = NULL,
  auto_index = FALSE,
  x_as = NULL,
  y_as = NULL
)

# S3 method for tbl_lazy
anti_join(
  x,
  y,
  by = NULL,
  copy = FALSE,
  ...,
  na_matches = c("never", "na"),
  sql_on = NULL,
  auto_index = FALSE,
  x_as = NULL,
  y_as = NULL
)

参数

x, y

一对由数据库查询支持的惰性 DataFrame 。

by

使用 join_by() 创建的连接规范,或要连接的变量的字符向量。

如果 NULL (默认值),*_join() 将使用 xy 之间的所有共同变量执行自然连接。一条消息列出了变量,以便您可以检查它们是否正确;通过显式提供 by 来抑制该消息。

要连接 xy 之间的不同变量,请使用 join_by() 规范。例如, join_by(a == b) 将匹配 x$ay$b

要连接多个变量,请使用带有多个表达式的 join_by() 规范。例如, join_by(a == b, c == d)x$ay$b 匹配,将 x$cy$d 匹配。如果 xy 之间的列名称相同,您可以通过仅列出变量名称来缩短列名称,例如 join_by(a, c)

join_by() 还可用于执行不等式连接、滚动连接和重叠连接。有关这些类型的连接的详细信息,请参阅?join_by 中的文档。

对于简单的等式连接,您也可以指定要连接的变量名称的字符向量。例如, by = c("a", "b")x$a 连接到 y$a 并将 x$b 连接到 y$b 。如果 xy 之间的变量名称不同,请使用命名字符向量,例如 by = c("x_a" = "y_a", "x_b" = "y_b")

要执行交叉联接,生成 xy 的所有组合,请参阅 cross_join()

copy

如果 xy 不是来自同一数据源,并且 copyTRUE ,则 y 将被复制到与 x 相同的数据库中的临时表中。 *_join() 将在创建的表上自动运行 ANALYZE,希望通过向查询规划器提供更多数据来使您的查询尽可能高效。

这允许您跨 src 联接表,但它可能是昂贵的操作,因此您必须选择它。

suffix

如果 xy 中存在未连接的重复变量,这些后缀将添加到输出中以消除它们的歧义。应该是长度为 2 的字符向量。

...

传递给方法的其他参数。

keep

来自 xy 的连接键是否应该保留在输出中?

  • 如果默认为 NULL ,则等式连接仅保留 x 中的键,而不等式连接则保留两个输入中的键。

  • 如果是 TRUE ,则保留两个输入的所有键。

  • 如果 FALSE ,则仅保留 x 中的 key 。对于右连接和全连接,与仅存在于 y 中的行对应的键列中的数据将合并到 x 中的键列中。在加入不平等条件时不能使用。

na_matches

NA (NULL) 值应该彼此匹配吗?默认值 "never" 是数据库通常的工作方式。 "na" 使连接的行为类似于 dplyr 连接函数 merge()match()%in%

multiple, unmatched

数据库后端不受支持。作为多次使用唯一键和不匹配的外键约束的解决方法。

sql_on

作为 SQL 表达式的自定义连接谓词。通常连接使用列相等,但您可以通过提供 sql_on 来执行更复杂的查询,sql_on 应该是一个 SQL 表达式,使用 LHSRHS 别名来引用连接的左侧或右侧分别。

auto_index

如果 copyTRUE ,则自动为 by 中的变量创建索引。如果 x 中有匹配的索引,这可能会加快连接速度。

x_as, y_as

用于 x 的别名。 y 。默认为"LHS""RHS"

另一个tbl_lazy。使用show_query()查看生成的查询,并使用collect()执行查询并将数据返回到R。

例子

library(dplyr, warn.conflicts = FALSE)

band_db <- tbl_memdb(dplyr::band_members)
instrument_db <- tbl_memdb(dplyr::band_instruments)
band_db %>% left_join(instrument_db) %>% show_query()
#> Joining with `by = join_by(name)`
#> <SQL>
#> SELECT `dplyr::band_members`.*, `plays`
#> FROM `dplyr::band_members`
#> LEFT JOIN `dplyr::band_instruments`
#>   ON (`dplyr::band_members`.`name` = `dplyr::band_instruments`.`name`)

# Can join with local data frames by setting copy = TRUE
band_db %>%
  left_join(dplyr::band_instruments, copy = TRUE)
#> Joining with `by = join_by(name)`
#> # Source:   SQL [3 x 3]
#> # Database: sqlite 3.41.2 [:memory:]
#>   name  band    plays 
#>   <chr> <chr>   <chr> 
#> 1 Mick  Stones  NA    
#> 2 John  Beatles guitar
#> 3 Paul  Beatles bass  

# Unlike R, joins in SQL don't usually match NAs (NULLs)
db <- memdb_frame(x = c(1, 2, NA))
label <- memdb_frame(x = c(1, NA), label = c("one", "missing"))
db %>% left_join(label, by = "x")
#> # Source:   SQL [3 x 2]
#> # Database: sqlite 3.41.2 [:memory:]
#>       x label
#>   <dbl> <chr>
#> 1     1 one  
#> 2     2 NA   
#> 3    NA NA   
# But you can activate R's usual behaviour with the na_matches argument
db %>% left_join(label, by = "x", na_matches = "na")
#> # Source:   SQL [3 x 2]
#> # Database: sqlite 3.41.2 [:memory:]
#>       x label  
#>   <dbl> <chr>  
#> 1     1 one    
#> 2     2 NA     
#> 3    NA missing

# By default, joins are equijoins, but you can use `sql_on` to
# express richer relationships
db1 <- memdb_frame(x = 1:5)
db2 <- memdb_frame(x = 1:3, y = letters[1:3])
db1 %>% left_join(db2) %>% show_query()
#> Joining with `by = join_by(x)`
#> <SQL>
#> SELECT `dbplyr_016`.`x` AS `x`, `y`
#> FROM `dbplyr_016`
#> LEFT JOIN `dbplyr_017`
#>   ON (`dbplyr_016`.`x` = `dbplyr_017`.`x`)
db1 %>% left_join(db2, sql_on = "LHS.x < RHS.x") %>% show_query()
#> <SQL>
#> SELECT `LHS`.`x` AS `x.x`, `RHS`.`x` AS `x.y`, `y`
#> FROM `dbplyr_016` AS `LHS`
#> LEFT JOIN `dbplyr_017` AS `RHS`
#>   ON (LHS.x < RHS.x)
源代码:R/verb-joins.R

相关用法


注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Join SQL tables。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。