在 SQL 服务器中组合 2 个复杂查询

Combining 2 complex queries in SQL Server

首先,我无法提供 SQL Fiddle,因为要重新创建数据真的很复杂。我会尽量清楚地呈现查询、输出和问题。

我有这样的查询:

with cte(MainArt,secondaryArt, Quantity) as(
SELECT t_mitm, t_sitm, t_qana
            FROM ttibom010201 
        WHERE TRIM(t_mitm) = 'ACL-4812070395-4'
union all
select 
ttibom010201.t_mitm, ttibom010201.t_sitm, ttibom010201.t_qana
from ttibom010201 inner join cte on cte.secondaryArt=ttibom010201.t_mitm
        )
select    cte.* ,dsc.t_cuni, dsc.t_dsca from cte
left join ttcibd001201 dsc on dsc.t_item = cte.secondaryArt 
where TRIM(secondaryArt)  like N'30%'

这个确切的查询 returns 我这 4 行:

从另一个 table 我使用这个 secondArt 值来获取一些信息:

select top 1 t_orno, t_item,t_pric from ttdpur401201 where t_item like '%30102024%' order by  t_ddte desc

结果是:

如您所见,t_item 和 secondaryArt 相同(第一个查询的第 3 行和第 4 行)。所以我希望能够以某种方式将这 2 个查询合并为 1 个。在第一个 table 中,我只需要添加这个 t_pric.

如何合并这两个查询?

我不确定 ttibom010201ttdpur401201 的基数,但您可以加入 CTE 中的 ttdpur401201 table 以获得价格。

with cte(MainArt,secondaryArt, Quantity, Price) as (
SELECT t_mitm, t_sitm, t_qana, t_pric
            FROM ttibom010201 b join ttdpur401201 p ON b.t_sitm = p.t_item 
)

同样适用于 CTE 查询的后半部分。

我不确定我是否完全知道你想要什么,但我会尝试类似

with cte( MainArt, secondaryArt, Quantity) as (
    select 
     t_mitm, 
     t_sitm, 
     t_qana
    from ttibom010201 
    where trim(t_mitm) = 'ACL-4812070395-4'
    union all
    select 
     ttibom010201.t_mitm, 
     ttibom010201.t_sitm, 
     ttibom010201.t_qana
    from ttibom010201 
    inner join cte on cte.secondaryArt = ttibom010201.t_mitm
)
select cte.*, dsc.t_cuni, dsc.t_dsca 
from cte
left join ttcibd001201 dsc on dsc.t_item = cte.secondaryArt
left join ( 
    select 
     t_orno, 
     t_item, 
     t_pric 
    from ttdpur401201 
    group by 
     t_orno, 
     t_item, 
     t_price 
    order by t_ddte desc
) i on i.t_item = cte.secondaryArt
where trim(secondaryArt) like N'30%'

请试试这个:

WITH cte1(mainart, secondaryart, quantity)
     AS (SELECT t_mitm,
                t_sitm,
                t_qana
         FROM   ttibom010201
         WHERE  Trim(t_mitm) = 'ACL-4812070395-4'
         UNION ALL
         SELECT ttibom010201.t_mitm,
                ttibom010201.t_sitm,
                ttibom010201.t_qana
         FROM   ttibom010201
                INNER JOIN cte1
                        ON cte1.secondaryart = ttibom010201.t_mitm),
     cte2
     AS (SELECT TOP 1 t_orno,
                      t_item,
                      t_pric
         FROM   ttdpur401201
         WHERE  t_item LIKE '%30102024%'
         ORDER  BY t_ddte DESC)
SELECT cte1.*,
       dsc.t_cuni,
       dsc.t_dsca,
       cte2.t_pric
FROM   cte1
       LEFT JOIN ttcibd001201 dsc
              ON dsc.t_item = cte1.secondaryart
       LEFT JOIN cte2
              ON cte1.secondaryart = cte2.t_item
WHERE  Trim(secondaryart) LIKE N'30%' 

预期结果: 以上应向您的原始查询添加一个额外的列 t_pric,如下所示:

t_pric
NULL
NULL
1.4
1.4

只需在两个查询之间进行左连接即可。

  with cte(MainArt,secondaryArt, Quantity) as(
SELECT t_mitm, t_sitm, t_qana
            FROM ttibom010201 
        WHERE TRIM(t_mitm) = 'ACL-4812070395-4'
union all
select 
ttibom010201.t_mitm, ttibom010201.t_sitm, ttibom010201.t_qana
from ttibom010201 inner join cte on cte.secondaryArt=ttibom010201.t_mitm
        )
select    cte.* ,dsc.t_cuni, dsc.t_dsca, t_pric from cte
left join ttcibd001201 dsc on dsc.t_item = cte.secondaryArt 
Left join (select  t_orno, t_item,t_pric from ttdpur401201 inner join cte on t_item like cte.secondaryArt order by  t_ddte desc) t
on cte.secondaryArt = t.t_item
where TRIM(secondaryArt)  like N'30%'

新修改的答案:

with cte(MainArt,secondaryArt, Quantity) as(
SELECT t_mitm, t_sitm, t_qana
            FROM ttibom010201 
        WHERE TRIM(t_mitm) = 'ACL-4812070395-4'
union all
select 
ttibom010201.t_mitm, ttibom010201.t_sitm, ttibom010201.t_qana
from ttibom010201 inner join cte on cte.secondaryArt=ttibom010201.t_mitm
        )
select    cte.* ,dsc.t_cuni, dsc.t_dsca, t_pric from cte
left join ttcibd001201 dsc on dsc.t_item = cte.secondaryArt 
Left join (select top 1 t_orno, t_item,t_pric,row_number()over(partition by t_item order by t_ddte desc) rnfrom ttdpur401201 ) t
on t.t_item like cte.secondaryArt  and t.rn=1
where TRIM(secondaryArt)  like N'30%'

我认为这个查询可行:

WITH cte(MainArt,secondaryArt, Quantity) AS (
    SELECT t_mitm, t_sitm, t_qana
    FROM ttibom010201 
    WHERE TRIM(t_mitm) = 'ACL-4812070395-4'
        
    UNION ALL

    SELECT ttibom010201.t_mitm, ttibom010201.t_sitm, ttibom010201.t_qana
    FROM ttibom010201 
    INNER JOIN cte ON cte.secondaryArt=ttibom010201.t_mitm
)
        
SELECT cte.* ,dsc.t_cuni, dsc.t_dsca, aux.t_pric1
FROM cte
LEFT JOIN ttcibd001201 dsc ON dsc.t_item = cte.secondaryArt 
LEFT JOIN (SELECT DISTINCT t_orno, t_item, FIRST_VALUE(t_pric) OVER (PARTITION BY t_orno, t_item ORDER BY t_ddte DESC) AS t_pric1 FROM ttdpur401201) AS aux ON aux.t_item = cte.secondaryArt
WHERE TRIM(secondaryArt) LIKE N'30%'