當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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