SQL Server 查询使用 2 个不同的索引,按文档编号行返回字段,然后按客户端信息将字段与字段分开

问题描述

我想编写一个查询,该查询将在一行中提取文档编号和其他一些相关字段,然后在接下来的几行中提取与该文档编号相关联的姓名和电子邮件地址。这是一张图片,可以参考我为什么要谈论。

enter image description here

到目前为止,我的代码为我提供了正确的结果,我的主要问题是由于缺乏更好的术语,我无法弄清楚如何使结果“组合”。这样在显示时,顶行是底几行的一部分。因此,我当前的查询正在提取内容如下。有没有办法我可以做到这一点?任何帮助将不胜感激,谢谢。我的代码在最后一张图片下方。

enter image description here

SELECT 
    ROW_NUMBER() OVER (ORDER BY DocNum) AS 'Row',T2.DocNum,T2.DocStatus,T1.ItemCode,T1.Description,T1.SerialNum,T2.CardName,T3.Name,T3.E_MailL,T3.EmlGrpCode,T4.CountryB,T4.StateB,T2.DocDueDate 
INTO 
    #Temptbl
FROM
    OITM T0
LEFT JOIN 
    DLN1 T1 WITH (NOLOCK) ON T0.ItemCode = T1.ItemCode
LEFT JOIN 
    ODLN T2 WITH (NOLOCK) ON T1.DocEntry = T2.DocEntry
LEFT JOIN
    OCPR T3 WITH (NOLOCK) ON T2.CardCode = T3.CardCode
LEFT JOIN
    DLN12 T4 WITH (NOLOCK) ON T2.DocEntry = T4.DocEntry
WHERE 
    T0.ItemCode = 'VT900785-4'
         
DECLARE @Id int
DECLARE @DNum int

WHILE EXISTS(SELECT * FROM #Temptbl)
BEGIN
    SELECT TOP 1 @id = Row FROM #Temptbl

    SELECT disTINCT @DNum = DocNum 
    FROM #Temptbl 
    WHERE Row = @id

    SELECT disTINCT 
        DocNum,DocStatus,ItemCode,Dscription,SerialNum,CardName,CountryB,StateB,DocDueDate 
    FROM
        #Temptbl 
    WHERE 
        Row = @id

    SELECT 
        Name,E_MailL,EmlGrpCode 
    FROM
        #Temptbl 
    WHERE
        DocNum = @DNum

    DELETE #Temptbl 
    WHERE DocNum = @DNum   
END

DROP TABLE #Temptbl

解决方法

这应该可以满足您的需求,尽管这样做确实很奇怪。列名没有多大意义。

select
    ISNULL(T3.Name,T2.DocNum),ISNULL(T3.E_MailL,T1.Dscription),ISNULL(T3.EmlGrpCode,T1.ItemCode),T2.DocStatus,T1.SerialNum,T2.CardName,T4.CountryB,T4.StateB,T2.DocDueDate 
from OITM T0
join DLN1 T1 on T0.ItemCode = T1.ItemCode
Join ODLN T2 on T1.DocEntry = T2.DocEntry
left join DLN12 T4 on T2.DocEntry = T4.DocEntry
cross join (values(0),(1)) v(IsChild)
left join OCPR T3 on T2.CardCode = T3.CardCode AND v.IsChild = 1
Where T0.ItemCode = 'VT900785-4'
ORDER BY T2.DocNum,v1.IsChild