带有联接tsql的COALESCE TSQL

时间:2019-09-18 08:42:27

标签: tsql

我需要提取多个地方的数据,并且如果使用合并功能,则需要某种形式的识别。基本上,我希望合并联接本身,但是在网上看起来似乎只能在现场进行。

因此,我们有一个产品和供应商表,我们也将它们作为临时表,因此共有4个表(产品,临时产品,供应商,临时供应商)。在供应商和产品表中,我们存储了我们的产品和供应商及其临时表,我们存储了任何新的供应商/产品。我们还有一个tempsupplierproduct,它将新的供应商加入到新产品中。但是,我们可能会遇到新供应商拥有现有产品的情况,因此新供应商将在tempsuppliers表中,而其产品不在产品表中tempproducts,因为它不是新产品,我们还将有一个新的tempsupplierproduct加入两个。

所以我想要一个查询,查询在tempsupplierproducts表中,然后获取有关供应商和产品的基本信息。为此,我正在使用合并。

SELECT DISTINCT SP.*, COALESCE(P.Product, PD.Product) 'Product', COALESCE(S.Supplier, SU.Supplier) 'Supplier'
FROM tempsupplierproduct SP
LEFT JOIN tempProduct P ON SP.ProductCode = P.Code
LEFT JOIN Products PD ON SP.ProductCode = PD.Code
LEFT JOIN tempSupplier S ON SP.SupplierCode = S.Code
LEFT JOIN Suppliers SU ON SP.SupplierCode = SU.Code  

现在,尽管这行得通,但我脑海中的某处告诉我这并不完全正确,理想情况下,我想如果数据不在表A中,然后联接到表B。我已经看到联接内部的合并,但是我不确定该怎么做

LEFT JOIN Suppliers Su ON SP.SupplierCode = COALESCE(S.Code, SU.Code)

也许已经走了,但是我对此感到困惑,它只是说在临时表中使用代码,如果没有的话就使用供应商代码。因此,如果我们在临时表中有代码,这将意味着尝试在其上进行联接,如果是的话,那么这也是不正确的。

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

您可以将两个供应商表合并在一起,然后像这样一并加入。我假设在这种情况下,两个表之间没有重复项,但是还有一些额外的工作可以解决。

this->fun(123);  // Or some other value

如果您需要处理两个供应商表中的重复项,则应采用这种方法,实际上,我们对重复项进行排名,然后选择排名最高的结果。对于两个表,您可以在两个表之间使用完全外部联接,但是这种方法可以扩展到任意数量的表。

WITH AllSuppliers AS
(
SELECT Code, Supplier FROM Suppliers
UNION ALL
SELECT Code, Supplier FROM tempSupplier
)
SELECT DISTINCT SP.*, COALESCE(P.Product, PD.Product) 'Product', S.Supplier
FROM tempsupplierproduct SP
LEFT JOIN tempProduct P ON SP.ProductCode = P.Code
LEFT JOIN Products PD ON SP.ProductCode = PD.Code
LEFT JOIN AllSuppliers S ON SP.SupplierCode = S.Code

答案 1 :(得分:0)

您绝对可以加入合并的领域。这是我的一个生产视图中的摘录:

LEFT JOIN [Portal].tblHelpdeskresource supplier ON PO.fld_str_SupplierID = supplier.fld_str_SupplierID
-- Job type a
    LEFT JOIN [Portal].tblHelpDeskFault HDF ON PO.fld_int_HelpdeskFaultID = HDF.fld_int_ID
    -- Job Type b
    LEFT JOIN [Portal].tblProjectHeader PH ON PO.fld_int_ProjectHeaderID = PH.fld_int_ID 
    LEFT JOIN [Portal].tblPPMScheduleLine PSL ON PH.fld_int_PPMScheduleRef = PSL.fld_int_ID
    -- Managers (used to be separate for a & b type, now converged)
    LEFT JOIN [Portal].uvw_HelpDeskSiteManagers PSM ON COALESCE(PSL.fld_int_StoreID,HDF.fld_int_StoreID) = PSM.PortalSiteId
    LEFT JOIN [Portal].tblHelpdeskResource PHDR ON PSM.PortalResourceId = PHDR.fld_int_ID