在 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.
如何合并这两个查询?
我不确定 ttibom010201
和 ttdpur401201
的基数,但您可以加入 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%'
首先,我无法提供 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.
如何合并这两个查询?
我不确定 ttibom010201
和 ttdpur401201
的基数,但您可以加入 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%'