我知道SQL Server中的连接.
例如.Table1,Table2有两个表.
他们的桌子结构如下.
create table Table1 (id int, Name varchar (10))
create table Table2 (id int, Name varchar (10))
Run Code Online (Sandbox Code Playgroud)
表1数据如下:
Id Name
-------------
1 A
2 B
Run Code Online (Sandbox Code Playgroud)
表2数据如下:
Id Name
-------------
1 A
2 B
3 C
Run Code Online (Sandbox Code Playgroud)
如果我执行下面提到的两个SQL语句,则两个输出都是相同的
select *
from Table1
left join Table2 on Table1.id = Table2.id
select *
from Table2
right join Table1 on Table1.id = Table2.id
Run Code Online (Sandbox Code Playgroud)
请解释上述SQL语句中左右连接的区别.
是否存在任何需要RIGHT JOIN的查询,或者是否可以使用LEFT JOIN重写它们?
更具体地说,如果没有正确的连接,你如何重写这个(我猜是没有任何子查询或其他幻想):
SELECT *
FROM t1
LEFT JOIN t2 ON t1.k2 = t2.k2
RIGHT JOIN t3 ON t3.k3 = t2.k3
我有一个函数,它接受两个可选的过滤参数,如果提供了这些参数,则过滤表中的数据。为此,我创建了一个盒装查询。我想用这个盒装查询创建一个正确的连接。Diesel 的当前文档没有提到右连接,但它似乎更喜欢这种belonging_to方法。我已将我的代码简化为一个示例:
#[macro_use] extern crate diesel;
use diesel::prelude::*;
table! {
groups (id) {
id -> Int4,
name -> Text,
}
}
table! {
user_groups (id) {
id -> Int4,
user_id -> Int4,
group_id -> Int4,
}
}
allow_tables_to_appear_in_same_query!(groups, user_groups);
#[derive(Debug, Queryable)]
struct Group {
id: i32,
name: String,
}
#[derive(Debug, Queryable, Associations)]
#[belongs_to(Group)]
struct UserGroup {
id: i32,
user_id: i32,
group_id: i32,
}
fn filter(
name: Option<&str>,
user_id: Option<i32>,
conn: &diesel::PgConnection,
) -> Result<Vec<(Group, Vec<UserGroup>)>, Box<dyn std::error::Error>> { …Run Code Online (Sandbox Code Playgroud)