Sql 同一个表上的内部查询-有更好的方法吗?

Sql 同一个表上的内部查询-有更好的方法吗?,sql,sqlite,inner-query,Sql,Sqlite,Inner Query,我有这两张表(简化版) 订单 owner_id | user_1 | user_2 | amount | order_id ----------------------------------------------- 1 | 2 | 3 | 100 | AAA 1 | 7 | 2 | 200 | BBB 2 | 3 | 5 | 400 | CCC user_id

我有这两张表(简化版)

订单

owner_id | user_1 | user_2 | amount | order_id
-----------------------------------------------
   1     |   2    |   3    |  100   |   AAA
   1     |   7    |   2    |  200   |   BBB
   2     |   3    |   5    |  400   |   CCC
user_id | username
------------------
   1    |  John
   2    |  Robert
   3    |  Sally
   4    |  Mario
   5    |  Albert
   6    |  Hernest
   7    |  Homer
用户

owner_id | user_1 | user_2 | amount | order_id
-----------------------------------------------
   1     |   2    |   3    |  100   |   AAA
   1     |   7    |   2    |  200   |   BBB
   2     |   3    |   5    |  400   |   CCC
user_id | username
------------------
   1    |  John
   2    |  Robert
   3    |  Sally
   4    |  Mario
   5    |  Albert
   6    |  Hernest
   7    |  Homer
我需要在一个查询中获得与特定订单相关的所有信息,包括
所有者id、用户1、用户2
用户名

我试图实现的结果如下:

owner_id | owner_username | user_1_id | user_1_username | user_2_id | user_2_username | order_total
----------------------------------------------------------------------------------------------------
   1     |     John       |    2      |     Robert      |    3      |     Sally       |     100
到目前为止,我通过这样一个查询获得了所需的一切:

SELECT o.owner_id AS owner_id, (SELECT username FROM Users where user_id = 1) AS owner_username,
       o.user_1 AS user_1_id, (SELECT username FROM Users where user_id = 2) AS user_1_username,
       o.user_2 AS user_2_id, (SELECT username FROM Users where user_id = 3) AS user_2_username,
       o.amount AS order_total
FROM Orders.o
WHERE o.order_id = 'AAA'
这是检索第一个订单信息的示例

我对获取每个用户名所需的内部查询不是很满意,我认为这有点难看

有没有一种更优雅或更高效的方法来获取用户名

谢谢

这可能会有帮助

SELECT od.*,
       U1.username AS 'User_1_Name',
       U2.username AS 'User_2_Name',
       U3.username AS 'User_3_Name'
FROM   Orders od
       LEFT OUTER JOIN Users U1
                    ON od.Owner_Id = U1.User_Id
       LEFT OUTER JOIN Users U2
                    ON od.User_1 = U2.User_Id
       LEFT OUTER JOIN Users U3
                    ON od.User_2 = U3.User_Id
WHERE  order_id = 'AAA' 

谢谢,请问为什么这个解决方案比我的好?我试图理解使用联接而不是直接使用内部查询的优点。。在我看来,结果是一样的。作为一般的经验法则,尽可能避免子查询。对于DBMS来说,优化子查询比优化常规联接更困难。您编写的查询只适用于第一条记录,因为您在内部查询中提供了硬编码where子句。从主查询中删除where子句并运行它,然后您将看到仅对第一条记录获得所需的结果。您需要连接才能从其他表中获取相应的值。