首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将TSQL与join tsql合并

将TSQL与join tsql合并
EN

Stack Overflow用户
提问于 2019-09-18 16:42:28
回答 2查看 50关注 0票数 2

我需要拾取位于多个位置的数据,并且如果使用合并函数,我会有某种形式的识别。基本上,我正在寻找联合本身,但在网上看起来,我似乎只能在领域上做这件事。

所以我们有一个Products和Suppliers表,我们也有一个临时表,所以总共有4个表(products,tempproducts,suppliers,tempsuppliers)。在suppliers and products表中,我们存储我们的产品和供应商及其临时表,我们存储任何新的供应商/产品。我们还有一个临时供应商产品,它将新供应商与新产品联系起来。但是,我们可以在这样的情况下结束:新的供应商有一个现有的产品,所以新的供应商将在临时供应商表中,其产品在产品表中,而不是临时产品表中,因为它不是新的,我们还将有一个新的临时供应商产品来连接这两个产品。

所以我想要一个查询,它在tempsupplierproducts表中查找,然后获得关于供应商和产品的基本信息。为此,我使用了一个coalesce。

代码语言:javascript
复制
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。我已经看到可能会在连接本身内部合并,但我不确定如何做到这一点

代码语言:javascript
复制
LEFT JOIN Suppliers Su ON SP.SupplierCode = COALESCE(S.Code, SU.Code)

也许会离开,但我对此感到困惑,它所说的就是在temptable中使用代码,如果不在temptable中,则使用供应商代码。那么,如果我们在temptable中有一个代码,这意味着什么,这是否会尝试连接它,如果是这样,那么这也是不正确的。

任何帮助我们都将不胜感激

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-18 16:57:18

您可以将两个suppliers表合并在一起,然后像这样一次性地连接它们。我假设在这种情况下,两个表之间没有重复项,但也可以解决一些额外的工作。

代码语言:javascript
复制
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

如果您需要处理两个suppliers表中的重复项,那么像这样的方法应该是可行的,基本上我们对重复项进行排序,然后选择排序最高的结果。对于两个表,您可以在这两个表之间使用完全的外连接,但是这种方法可以扩展到任意数量的表。

代码语言:javascript
复制
WITH AllSuppliers AS
(
SELECT Code, Supplier, 1 AS TablePriority FROM Suppliers
UNION ALL
SELECT Code, Supplier, 2 AS TablePriority FROM tempSupplier
),
SuppliersRanked AS
(
SELECT Code, Supplier,
    ROW_NUMBER() OVER (PARTITION BY Code ORDER BY TablePriority) AS RowPriority
FROM AllSuppliers
)
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 SuppliersRanked S ON SP.SupplierCode = S.Code
    AND RowPriority = 1
票数 2
EN

Stack Overflow用户

发布于 2019-09-19 00:32:56

您完全可以在合并字段上进行连接。下面是我的一个production视图中的一个片段:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57988565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档