【问题标题】:Is it possible to write an SQL query to find data in more than one column based on a third value?是否可以编写一个 SQL 查询来根据第三个值在多个列中查找数据?
【发布时间】:2020-03-29 19:07:47
【问题描述】:

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

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

这样做的效果是,Hector 的设备显示客户 001 和 002,Jim 的设备显示客户 019,而 Tonk 的设备显示客户 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'

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.Route
where Users.UserType = 'R'

这可能吗?我能找到的关于两列的唯一信息是匹配不止一列的数据,例如 Year = '2010' 和 Mfg = 'Ford'。

谢谢。

【问题讨论】:

    标签: sql join left-join where-clause


    【解决方案1】:

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

    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
    

    Demo on DB Fiddled

    用户名 |姓名 |类型 |链接 |身份证 |姓名 -----: | :----------- | :--- | ---: | --: | :------------- 1 |赫克托·洛佩兹 | C | 1 | 1 |约翰史密斯公司 1 |赫克托·洛佩兹 | C | 2 | 2 |约翰史密斯#2 3 |唐克路 |右 | 132 | 1 |约翰史密斯公司 3 |唐克路 |右 | 132 | 15 |太阳之家 3 |唐克路 |右 | 132 | 137 |玛丽·马龙斯 309 |吉姆柯克 | C | 19 | 19 |伙伴

    【讨论】:

      【解决方案2】:

      如果我理解正确,您想连接两个表,但使用由类型确定的字段。如果是这样,您可以使用两个left joins 和coalesce()

      select c.*,
             coalesce(rr.name, rc.name) as name
      from customers c left join
           routes rc
           on rc.link = c.id and rc.type = 'C' left join
           routes rr
           on rc.link = c.route and rc.type = 'R';
      

      我不确定您的查询与该问题有什么关系。该问题仅涉及两个表格。

      【讨论】:

        【解决方案3】:

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

        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 AND Users.UserType = 'C'
        LEFT OUTER JOIN Customers
            ON UserLink.LinkID = Customers.Route AND Users.UserType = 'R'
        

        【讨论】:

          【解决方案4】:

          您可以在连接中使用多个子句。听起来你想要这样的东西:

          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)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-10
            • 1970-01-01
            • 2021-03-08
            • 2010-10-23
            • 2018-07-02
            • 1970-01-01
            相关资源
            最近更新 更多