【问题标题】:How can I write a query with 2 states?如何编写具有 2 个状态的查询?
【发布时间】:2013-12-01 09:22:33
【问题描述】:

我有表客户

Id  Code    Name
1   100     John
2   200     Jack
3   300     Mike
4   400     Betty

和表SaleType

Id  Code    Name
1   1000    cash
2   2000    cheque
3   3000    free

还有一个表格,描述哪个客户拥有哪个销售类型,名为 SaleType_Customer

Id  SaleTypeID  CustomerID
1   1           1
2   1           2
3   2           1
4   2           3

我想编写一个获取客户 SaleTypes 的查询。但是,如果客户不在表 SaleType_Customer 中,则查询将返回所有 SaleTypes。我该如何编写这个查询?

我的查询:

SELECT  SaleType.ID, SaleType.Code, SaleType.Name
 FROM SaleType left outer join SaleType_Customer on SaleType.Id = SaleType_Customer.SaleTypeID 

Where SaleType_Customer.CustomerID= 1 

我想要 John (id=1) 的结果:

Id  Code    Name
1   1000    cash
2   2000    cheque

对于 Betty (id=4) 来说是完整的,因为她不在 SaleType_Customer

Id  Code    Name
1   1000    cash
2   2000    cheque
3   3000    free

我应该如何编写查询?

【问题讨论】:

    标签: sql sqlite join


    【解决方案1】:
    SELECT distinct SaleType.ID, SaleType.Code, SaleType.Name
     FROM Customer left join SaleType_Customer  
    on CustomerID = Customer.Id 
    ,SaleType
    where (SaleTypeID = SaleType.Id or SaleTypeID is NULL)
    and Customer.ID= 4;
    

    这里是SQLFiddle

    【讨论】:

    • 两者都是真的。哪个更快?
    【解决方案2】:
    SELECT SaleType.ID, SaleType.Code, SaleType.Name
      FROM SaleType
     WHERE NOT EXISTS (SELECT *
              FROM SaleType_Customer
             WHERE SaleType_Customer.Customerid = 4)
    UNION
    
    SELECT SaleType.ID, SaleType.Code, SaleType.Name
      FROM SaleType
     INNER JOIN SaleType_Customer
        ON SaleType_Customer.Saletypeid = SaleType.Id
     WHERE SaleType_Customer.Customerid = 4
    

    Sqlfiddle sample (oracle)

    【讨论】:

    • 两者都是真的。哪个更快?
    • 由于执行计划,@snyder 的答案似乎更快。我必须承认这也更具创新性。
    • 感谢您的回答
    猜你喜欢
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 2020-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多