joins {SCDB} | R Documentation |
SQL Joins
Description
Overloads the dplyr *_join
to accept an na_by
argument.
By default, joining using SQL does not match on NA
/ NULL
.
dbplyr *_join
s has the option "na_matches = na" to match on NA
/ NULL
but this is very inefficient in some
cases.
This function does the matching more efficiently:
If a column contains NA
/ NULL
, the names of these columns can be passed via the na_by
argument and
efficiently match as if "na_matches = na".
If no na_by
argument is given is given, the function defaults to using dplyr::*_join
.
Usage
## S3 method for class 'tbl_sql'
inner_join(x, y, by = NULL, ...)
## S3 method for class 'tbl_sql'
left_join(x, y, by = NULL, ...)
## S3 method for class 'tbl_sql'
right_join(x, y, by = NULL, ...)
## S3 method for class 'tbl_sql'
full_join(x, y, by = NULL, ...)
## S3 method for class 'tbl_sql'
semi_join(x, y, by = NULL, ...)
## S3 method for class 'tbl_sql'
anti_join(x, y, by = NULL, ...)
Arguments
x , y |
A pair of lazy data frames backed by database queries. |
by |
A join specification created with If To join on different variables between To join by multiple variables, use a
For simple equality joins, you can alternatively specify a character vector
of variable names to join by. For example, To perform a cross-join, generating all combinations of |
... |
Other parameters passed onto methods. |
Value
Another tbl_lazy
. Use show_query()
to see the generated
query, and use collect()
to execute the query
and return data to R.
See Also
dplyr::mutate-joins which this function wraps.
dbplyr::join.tbl_sql which this function wraps.
Examples
library(dplyr, warn.conflicts = FALSE)
library(dbplyr, warn.conflicts = FALSE)
band_db <- tbl_memdb(dplyr::band_members)
instrument_db <- tbl_memdb(dplyr::band_instruments)
left_join(band_db, instrument_db) |>
show_query()
# Can join with local data frames by setting copy = TRUE
left_join(band_db, dplyr::band_instruments, copy = TRUE)
# 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"))
left_join(db, label, by = "x")
# But you can activate R's usual behaviour with the na_matches argument
left_join(db, label, by = "x", na_matches = "na")
# 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])
left_join(db1, db2) |> show_query()
left_join(db1, db2, sql_on = "LHS.x < RHS.x") |> show_query()