【问题标题】:How to do a join with multiple conditions in the second joined table?如何在第二个联接表中进行具有多个条件的联接?
【发布时间】:2011-05-07 13:52:58
【问题描述】:

我有 2 张桌子。第一个表是客户列表。

第二个表是这些客户拥有的设备列表,其中包含有关该客户的一些数据(客户问题)的另一个字段。问题是对于每个客户,可能存在多个问题。

我需要对这些表进行联接,但只返回遇到其中两个问题的客户的结果。

问题是,如果我加入 OR,我得到的结果包括只有其中一个问题的客户。

如果我做 AND,我不会得到任何结果,因为每一行只包含一个条件。

如何在 T-SQL 2008 中做到这一点?

【问题讨论】:

  • 您能否进一步澄清您的问题,您的意思是您需要重新运行包含 2 个或更多问题的结果吗?
  • @Raymund:对,我需要退回有这两个问题的客户。

标签: sql sql-server sql-server-2008 tsql join


【解决方案1】:
SELECT * 
FROM customers as c
LEFT JOIN equipment as e
ON c.customer_id = e.customer_id  --> what you are joining on
WHERE (
          SELECT COUNT(*) 
          FROM equipment as e2 
          WHERE e2.customer.id = c.customer_id
      ) > 1

【讨论】:

    【解决方案2】:

    您可以使用子查询而不是联接来做到这一点:

    select * from Customer C where (select Count(*) from Issue I where I.CustomerID = C.CustomerID) < 2 
    

    或者你想要的任何值

    【讨论】:

    • 不会只返回有 0 或 1 个问题的行。最后应该是 '> 1' 来返回有 2 个或更多问题的行,或者 '= 2' 来返回只有 2 个问题的行。
    • 正如我之前写的,你可以使用任何你想要的子句,查询的要点是在子查询中选择计数,我希望你能改变它以满足你的需要。
    【解决方案3】:

    除非我误解了,否则我认为您想要这样的东西(如果您只对有 2 个特定问题的客户感兴趣):

    SELECT c.*
    FROM Customer c
        INNER JOIN CustomerEquipment e1 ON c.CustomerId = e1.CustomerId AND e1.Issue = 'Issue 1'
        INNER JOIN CustomerEquipment e2 ON c.CustomerId = e2.CustomerId AND e2.Issue = 'Issue 2'
    

    或者,查找任何类型的存在多个问题的客户:

    ;WITH Issues AS
    (
        SELECT CustomerId, COUNT(*)
        FROM CustomerEquipment
        GROUP BY CustomerId
        HAVING COUNT(*) > 1
    )
    
    SELECT c.*
    FROM Customer c
        JOIN Issues i ON c.CustomerId = i.CustomerId
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-25
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-04
      相关资源
      最近更新 更多