是否可以编写SQL查询以基于第三个值在多个列中查找数据?

是否可以编写SQL查询以基于第三个值在多个列中查找数据?,sql,join,left-join,where-clause,Sql,Join,Left Join,Where Clause,我有一个如下所示的客户数据库: ID | Name | Route ------------------------------ 001 | John Smith Co. | 132 002 | John Smith #2 | 201 015 | Casa del Sol | 132 019 | Partners | 201 137 | Mary Malones | 132 有些用户是C类型的,他们将按客户编号分配一个或多个客户。一些用户

我有一个如下所示的客户数据库:

ID  | Name            | Route
------------------------------
001 | John Smith Co.  | 132
002 | John Smith #2   | 201
015 | Casa del Sol    | 132
019 | Partners        | 201
137 | Mary Malones    | 132
有些用户是C类型的,他们将按客户编号分配一个或多个客户。一些用户是R类型的,他们将被分配一个或多个路线编号,这将他们链接到这些路线中的所有客户

UserID | Name                 | Type | Link
---------------------------------------------
00001  | Hector Lopez         | C    | 001
00001  | Hector Lopez         | C    | 002
00003  | Tonk Lu              | R    | 132
00309  | Jim Kirk             | C    | 019
其效果是赫克托的设备显示客户001和002,吉姆的设备显示客户019,唐克的设备显示客户001、015和137。(他们分别是连锁店经理、客户和销售代表。)

我试图创建一个查询,显示所有用户的所有客户,如下所示:

UserID | Name                 | Type | ID  | Name            
-------------------------------------------------------------
00001  | Hector Lopez         | C    | 001 | John Smith Co.  
00001  | Hector Lopez         | C    | 002 | John Smith #2   
00003  | Tonk Lu              | R    | 001 | John Smith Co.
00003  | Tonk Lu              | R    | 015 | Casa del Sol
00003  | Tonk Lu              | R    | 137 | Mary Malones 
00309  | Jim Kirk             | C    | 019 | Partners       
但是我被如何处理R和C逻辑所困扰。我有两个查询,但理想情况下我希望能够运行一个查询

Select Users.Username, Users.UserType, Customers.CustomerID, Customers.Name
from Users 
left outer join UserLink on Users.Username = UserLink.Username
left outer join Customers on UserLink.LinkID = Customers.CustomerID
where Users.UserType = 'C'

这可能吗?我能找到的关于两列的唯一信息是匹配多个列的数据,比如年份='2010'和制造商='Ford'


谢谢。

您可以在join中使用多个子句。听起来你想要的是:

Select Users.Username, Users.UserType, Customers.CustomerID, Customers.Name
from Users 
left outer join UserLink 
 on Users.Username = UserLink.Username
left outer join Customers 
 on (Users.UserType='C' and UserLink.LinkID = Customers.CustomerID) 
  OR (Users.UserType='R' and UserLink.LinkID = Customers.Route)

可以在联接中使用多个子句。听起来你想要的是:

Select Users.Username, Users.UserType, Customers.CustomerID, Customers.Name
from Users 
left outer join UserLink 
 on Users.Username = UserLink.Username
left outer join Customers 
 on (Users.UserType='C' and UserLink.LinkID = Customers.CustomerID) 
  OR (Users.UserType='R' and UserLink.LinkID = Customers.Route)

您的第一个选择是
UNION
您已有的两个查询。
您还可以在
JOIN
子句的
ON
部分中使用条件:

选择Users.Username、Users.UserType、Customers.CustomerID、Customers.Name
来自用户
左外部联接用户链接
关于Users.Username=UserLink.Username
左外接客户
在UserLink.LinkID=Customers.CustomerID和Users.UserType='C'
左外接客户
在UserLink.LinkID=Customers.Route和Users.UserType='R'

您的第一个选择是将您已有的两个查询
联合起来。
您还可以在
JOIN
子句的
ON
部分中使用条件:

选择Users.Username、Users.UserType、Customers.CustomerID、Customers.Name
来自用户
左外部联接用户链接
关于Users.Username=UserLink.Username
左外接客户
在UserLink.LinkID=Customers.CustomerID和Users.UserType='C'
左外接客户
在UserLink.LinkID=Customers.Route和Users.UserType='R'

如果我理解正确,您希望联接两个表,但使用由类型确定的字段。如果是这样,您可以使用两个
左连接和
合并()


我不知道你的问题与这个问题有什么关系。问题只涉及两个表。

如果我理解正确,您希望连接两个表,但使用由类型确定的字段。如果是这样,您可以使用两个
左连接和
合并()


我不知道你的问题与这个问题有什么关系。问题只涉及两个表。

无需连接两次;您可以使用
ed连接条件实现逻辑:

select
    l.*,
    u.ID,
    u.Name
from Users u
inner join UserLinks l
    on (l.Type = 'C' and l.Link = u.ID)
    or (l.Type = 'R' and l.Link = u.Route)
order by l.UserID, u.ID

UserID | Name | Type | Link | ID | Name -----: | :----------- | :--- | ---: | --: | :------------- 1 | Hector Lopez | C | 1 | 1 | John Smith Co. 1 | Hector Lopez | C | 2 | 2 | John Smith #2 3 | Tonk Lu | R | 132 | 1 | John Smith Co. 3 | Tonk Lu | R | 132 | 15 | Casa del Sol 3 | Tonk Lu | R | 132 | 137 | Mary Malones 309 | Jim Kirk | C | 19 | 19 | Partners UserID | Name | Type | Link | ID | Name -----: | :----------- | :--- | ---: | --: | :------------- 1 |赫克托·洛佩兹| C | 1 | 1 |约翰·史密斯公司。 1 |赫克托·洛佩兹| C | 2 | 2 |约翰·史密斯| 2 3 |东路| R | 132 | 1 |约翰·史密斯公司。 3 |东路| R | 132 | 15 |太阳之家 3 |东路| R | 132 | 137 |玛丽·马龙 309 |吉姆·柯克| C | 19 | 19 |合伙人
不需要加入两次;您可以使用
ed连接条件实现逻辑:

select
    l.*,
    u.ID,
    u.Name
from Users u
inner join UserLinks l
    on (l.Type = 'C' and l.Link = u.ID)
    or (l.Type = 'R' and l.Link = u.Route)
order by l.UserID, u.ID

UserID | Name | Type | Link | ID | Name -----: | :----------- | :--- | ---: | --: | :------------- 1 | Hector Lopez | C | 1 | 1 | John Smith Co. 1 | Hector Lopez | C | 2 | 2 | John Smith #2 3 | Tonk Lu | R | 132 | 1 | John Smith Co. 3 | Tonk Lu | R | 132 | 15 | Casa del Sol 3 | Tonk Lu | R | 132 | 137 | Mary Malones 309 | Jim Kirk | C | 19 | 19 | Partners UserID | Name | Type | Link | ID | Name -----: | :----------- | :--- | ---: | --: | :------------- 1 |赫克托·洛佩兹| C | 1 | 1 |约翰·史密斯公司。 1 |赫克托·洛佩兹| C | 2 | 2 |约翰·史密斯| 2 3 |东路| R | 132 | 1 |约翰·史密斯公司。 3 |东路| R | 132 | 15 |太阳之家 3 |东路| R | 132 | 137 |玛丽·马龙 309 |吉姆·柯克| C | 19 | 19 |合伙人