【问题标题】:can I use subquery in the inner join condition sql我可以在内部连接条件 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中添加条件

标签: sql


【解决方案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'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-03
        • 1970-01-01
        • 2012-11-14
        • 2013-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-22
        相关资源
        最近更新 更多