是否可以编写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 |合伙人