【问题标题】:Best practice for joining tables with case将表与案例连接的最佳实践
【发布时间】:2014-04-12 09:26:05
【问题描述】:

我需要在两种不同的情况下加入两个不同的表。在这种情况下,我必须用这两种解决方案来解决我的问题;

1) 我将创建一个语句(S.ShipmentType) 以在 join 中使用,如下所示:

SELECT  S.*, P.*

,CASE
    WHEN S.ShipmentType = 'import' THEN SP.SupplierName
    WHEN S.ShipmentType = 'export' THEN C.CustomerName
END AS ShipmentDesination

FROM            tblShippments   S 
INNER JOIN      tblProducts     P   ON S.productId = P.productID  
LEFT OUTER JOIN tblCustomers    C   ON S.companyId = C.customerId AND S.ShipmentType = 'export'
LEFT OUTER JOIN tblSuppliers    SP  ON S.companyId = SP.supplierId AND S.ShipmentType = 'import'

2) 或者我会为导入和导出创建两个不同的出货表,然后使用两个不同的查询来获取数据。

哪一个是最佳实践?

【问题讨论】:

    标签: sql join case


    【解决方案1】:

    我想我会用两个单独的查询来做到这一点,但我也不讨厌这个解决方案。我觉得都是可行的。

    顺便说一句,我认为您应该能够在没有CASE WHEN 的情况下解决这个问题,假设 CompanyId 在 tblCustomers 和 tblSuppliers 中都是唯一的。在这种情况下,您可以简单地这样做:

    COALESCE(SP.SupplierName, C.CustomerName)
    

    【讨论】:

    • 感谢您的回答不幸的是,id 号码可能相同,但即使如此 COALESCE 也可以工作,因为 S.ShipmentType 过滤器加入。但是关于性能我仍然无法想象我会产生什么样的效果。
    • SQL 的性能相当棘手,因为它是声明性的。它取决于许多事情,例如使用的数据库实现、索引和表中的数据量。一般来说,对于像这样的简单查询,除非我们谈论数百万条记录,否则我不会担心性能。
    • 其实这个例子不是我的问题,我想写一个可以理解的问题。现在我的表中有 300.000 条记录。但是正如您所说,两种解决方案之间似乎没有太大区别。
    猜你喜欢
    • 2015-03-25
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 2012-10-10
    • 2022-07-08
    • 2011-01-12
    • 1970-01-01
    相关资源
    最近更新 更多