Tsql 是否可以在不破坏行的情况下从左连接使用var进行连接?

Tsql 是否可以在不破坏行的情况下从左连接使用var进行连接?,tsql,sqlite,Tsql,Sqlite,我的代码生成一个大型查询。一个简单的版本是 SELECT * FROM main_table as mt JOIN user_data AS ud ON mt.user_id=ud.id LEFT JOIN ban_Status AS bs ON ud.status_id=bs.id JOIN AnotherTable ON bs.data=AnotherTable.id 注意:此代码未经测试 当我删除最后一个连接时,我会得到结果。我也可以把它改成左连接,但那是错误的。如果ud.statu

我的代码生成一个大型查询。一个简单的版本是

SELECT * FROM main_table as mt
JOIN user_data AS ud ON mt.user_id=ud.id 
LEFT JOIN ban_Status AS bs ON  ud.status_id=bs.id
JOIN AnotherTable ON bs.data=AnotherTable.id
注意:此代码未经测试

当我删除最后一个连接时,我会得到结果。我也可以把它改成左连接,但那是错误的。如果ud.status不为null,我希望加入,就像我从ban_status执行select查询时一样。我该如何解决这个问题?如果我离开父表,我必须在每个表上写左联接吗?那不会给我带来副作用吗


我正在使用sqlite ATM,但将切换到tsql,使用左连接,但在WHERE子句中指定ud.status\u id为null,AnotherTable.id为null,或者两者都不为null

SELECT * FROM main_table as mt
JOIN user_data AS ud ON mt.user_id=ud.id 
LEFT JOIN ban_Status AS bs ON  ud.status_id=bs.id
LEFT JOIN AnotherTable ON bs.data=AnotherTable.id
WHERE (ud.status_id is null and AnotherTable.id is null)
       or (ui.status_id is not null and AnotherTable.id is not null)

这将阻止您选择任何具有ban_状态但没有来自另一个表的附加数据的记录。

使用左连接,但在WHERE子句中指定ud.Status_id为null,AnotherTable.id为null或两者都不为null

SELECT * FROM main_table as mt
JOIN user_data AS ud ON mt.user_id=ud.id 
LEFT JOIN ban_Status AS bs ON  ud.status_id=bs.id
LEFT JOIN AnotherTable ON bs.data=AnotherTable.id
WHERE (ud.status_id is null and AnotherTable.id is null)
       or (ui.status_id is not null and AnotherTable.id is not null)

这将阻止您选择任何具有ban_状态但没有其他表中附加数据的记录。

+1。这似乎是可行的,但您能否解释一下为什么左连接链中的内部连接会使所有这些左连接都表现为内部连接?如果
左连接
无法连接行,那么它将在所有字段中返回
NULL
。然后,如果在
NULL
id上使用
内部联接
,则整个行将被丢弃(由于
内部联接
规则)。这并不是因为内部联接在列表的下方,而是因为它联接到联接右侧的表。如果将它连接到别名为ud的表,则不会出现此问题。我仍然喜欢把我所有的左连接放在连接的末尾,这提醒我,如果我连接了它们的任何东西,我也需要使它成为左连接。+1。这似乎是可行的,但您能否解释一下为什么左连接链中的内部连接会使所有这些左连接都表现为内部连接?如果
左连接
无法连接行,那么它将在所有字段中返回
NULL
。然后,如果在
NULL
id上使用
内部联接
,则整个行将被丢弃(由于
内部联接
规则)。这并不是因为内部联接在列表的下方,而是因为它联接到联接右侧的表。如果将它连接到别名为ud的表,则不会出现此问题。我仍然喜欢把我所有的左连接放在连接的末尾,这提醒我,如果我将任何东西连接到它们,我也需要使它成为左连接。