我可以在内部连接条件 sql 中使用子查询吗
Posted
技术标签:
【中文标题】我可以在内部连接条件 sql 中使用子查询吗【英文标题】:can I use subquery in the inner join condition sql 【发布时间】:2017-06-07 20:39:15 【问题描述】:表(旅行)
| Id | Client_Id | Driver_Id | City_Id | Status |Request_at|
| 1 | 1 | 10 | 1 | completed |2013-10-01|
| 2 | 2 | 10 | 1 | completed |2013-10-02|
| 3 | 3 | 11 | 6 | completed |2013-10-03|
表(用户)
Users_Id | Banned | Role |
| 1 | No | client |
| 2 | Yes | client |
| 3 | No | client |
| 4 | No | driver|
如果用户角色需要是客户端并且这些客户端应该被取消禁止,我如何才能加入这 2 个表(旅行、用户)。 我正在尝试使用子查询,但出现“单行子查询返回多行”错误并且不确定出了什么问题。
SELECT * FROM Trips
INNER JOIN users
ON client_id = (SELECT users_id from users
where
role = 'Client' and banned = 'No');
【问题讨论】:
你可以简单的在join中添加条件 【参考方案1】:不需要子选择,只需将这些条件放入连接条件即可。
SELECT *
FROM Trips
JOIN users ON trips.client_id = users.users_id
and users.role = 'Client'
and users.banned = 'No';
因为这是一个内连接,这相当于:
SELECT *
FROM Trips
JOIN users ON trips.client_id = users.users_id
WHERE users.role = 'Client'
and users.banned = 'No';
如果您使用了外连接,这将不会有所不同
【讨论】:
【参考方案2】:您不需要子查询 连接应该在 Trips 和 Users 之间,例如:
SELECT *
FROM Trips
INNER JOIN users ON Trips.client_id = usres.users_id
and users.role = 'Client'
and users.banned = 'No';
【讨论】:
【参考方案3】: SELECT *
FROM Trips
INNER JOIN Users ON [Trips].Id = [Users].User_Id AND [Users].Role = 'client' AND [Users].Banned = 'No'
【讨论】:
方括号在 SQL 标识符中无效,并且该问题未使用任何特定 DBMS 标记(允许这种非标准语法) 我很确定方括号是完全合法的。我在所有存储过程中使用它们来在连接表时识别表名。这就是我个人格式化和编写 SQL 的方式,它是完全有效的语法。这个问题不必提出来。 它们在“SQL”(查询语言)中是不合法的。标签sql
指的是 ANSI SQL,而不是可能允许非标准标识符的特定 DBMS 产品
好吧,他显然在使用 SQL Server,它允许这样做,那么你为什么要对一个不会改变我对他的解决方案的小语法偏好持反对态度?
您从哪里看出他“明显”在使用 SQL Server?另外:sql
标签的标签信息说:“用 SQL 标记的问题的答案应该使用 ISO/IEC 标准 SQL”【参考方案4】:
试试
SELECT * FROM Trips
INNER JOIN users ON users.users_id = Trips.Client_ID
WHERE users.Banned = 'No' AND users.Role = 'client'
【讨论】:
以上是关于我可以在内部连接条件 sql 中使用子查询吗的主要内容,如果未能解决你的问题,请参考以下文章