这些是 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()
将使用x
和y
之间的所有共同变量执行自然连接。一条消息列出了变量,以便您可以检查它们是否正确;通过显式提供by
来抑制该消息。要连接
x
和y
之间的不同变量,请使用join_by()
规范。例如,join_by(a == b)
将匹配x$a
到y$b
。要连接多个变量,请使用带有多个表达式的
join_by()
规范。例如,join_by(a == b, c == d)
将x$a
与y$b
匹配,将x$c
与y$d
匹配。如果x
和y
之间的列名称相同,您可以通过仅列出变量名称来缩短列名称,例如join_by(a, c)
。join_by()
还可用于执行不等式连接、滚动连接和重叠连接。有关这些类型的连接的详细信息,请参阅?join_by 中的文档。对于简单的等式连接,您也可以指定要连接的变量名称的字符向量。例如,
by = c("a", "b")
将x$a
连接到y$a
并将x$b
连接到y$b
。如果x
和y
之间的变量名称不同,请使用命名字符向量,例如by = c("x_a" = "y_a", "x_b" = "y_b")
。要执行交叉联接,生成
x
和y
的所有组合,请参阅cross_join()
。 - copy
-
如果
x
和y
不是来自同一数据源,并且copy
是TRUE
,则y
将被复制到与x
相同的数据库中的临时表中。*_join()
将在创建的表上自动运行ANALYZE
,希望通过向查询规划器提供更多数据来使您的查询尽可能高效。这允许您跨 src 联接表,但它可能是昂贵的操作,因此您必须选择它。
- suffix
-
如果
x
和y
中存在未连接的重复变量,这些后缀将添加到输出中以消除它们的歧义。应该是长度为 2 的字符向量。 - ...
-
传递给方法的其他参数。
- keep
-
来自
x
和y
的连接键是否应该保留在输出中?-
如果默认为
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 表达式,使用LHS
和RHS
别名来引用连接的左侧或右侧分别。 - auto_index
-
如果
copy
是TRUE
,则自动为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 dbplyr backend-teradata 后端:Teradata
- R dbplyr escape 转义/引用字符串。
- R dbplyr expand.tbl_lazy 扩展 SQL 表以包含所有可能的值组合
- R dbplyr distinct.tbl_lazy 子集不同/唯一行
- R dbplyr backend-sqlite 后端:SQLite
- R dbplyr pivot_wider.tbl_lazy 将数据从长轴转向宽轴
- R dbplyr build_sql 构建 SQL 字符串。
- R dbplyr mutate.tbl_lazy 创建、修改和删除列
- R dbplyr collapse.tbl_sql 计算查询的结果
- R dbplyr sql_expr 从 R 表达式生成 SQL
- R dbplyr get_returned_rows 提取并检查返回的行
- R dbplyr dbplyr_uncount “计数”数据库表
- R dbplyr count.tbl_lazy 按组计数观察值
- R dbplyr backend-odbc 后端:ODBC
- R dbplyr head.tbl_lazy 对第一行进行子集化
- R dbplyr db-quote SQL 转义/引用泛型
- R dbplyr copy_inline 在 dbplyr 查询中使用本地 DataFrame
- R dbplyr backend-oracle 后端:甲骨文
- R dbplyr backend-snowflake 后端:雪花
- R dbplyr lahman 缓存并检索 Lahman 棒球数据库的 src_sqlite。
- R dbplyr backend-redshift 后端:红移
- R dbplyr partial_eval 部分评估表达式。
- R dbplyr group_by.tbl_lazy 按一个或多个变量分组
- R dbplyr tbl_lazy 创建本地惰性 tibble
- R dbplyr backend-hana 后端:SAP HANA
注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Join SQL tables。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。