這些是 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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。