嵌套 SQL selection - 相同 select 以获得更深入的结果
Nested SQL selection - identical select for deeper results
我只有一个 table 里面有所有需要的数据。最初的selection是这样的:
SELECT t_mitm as MainArt, t_sitm as secondaryArt, t_qana as quantity
FROM ttibom010201
WHERE TRIM(t_mitm) = N'ACL-3382040385-4'
returned 结果是:
MainArt secondaryArt Quantity
ACL-3382040385-4 ACL-4812070395-4 M1 1
ACL-3382040385-4 ACL-4812070395-4 M3 1
ACL-3382040385-4 ACL-4812070395-4 M2 1
ACL-3382040385-4 30201039 0,032
我想检查 secondaryArt
是否所有列的结果都以“30%”开头,并且它是否不以“30%”开头以对其执行完全相同的查询 - 这些示例应该前 3 行执行 3 次,因为
有 3 个元素不以 '30%' ( ACL-4812070395-4 M1 , ACL-4812070395-4 M3 , ACL-4812070395-4 M2).
这是第一行的例子。它必须执行:
select t_mitm as MainArt, t_sitm as secondaryArt, t_qana as quantity
from ttibom010201
where TRIM(t_mitm) = N'ACL-4812070395-4 M1'
所以这里也有机会 return 获取以 '30%' 或其他名称开头的 secondaryArt
数据。如果是其他情况,则必须再次执行这些查询以查找其中的元素。
基本上,最后所有 returned 元素应该有 secondaryArt
以 '30%' 开头
如何让它只在 SQL 中自动运行?是否可能,或者我应该从我的 JS 代码中 1 到 1 地获取数据?
更新:
CREATE TABLE IF NOT EXISTS `MyData` (
`MainArt` char(200) NOT NULL,
`secondaryArt` char(200) NOT NULL
)
INSERT INTO `MyData` (`MainArt`, `secondaryArt`) VALUES
('ACL-3382040385-4', 'ACL-4812070395-4 M1'),
('ACL-3382040385-4', 'ACL-4812070395-4 M3'),
('ACL-3382040385-4', 'ACL-4812070395-4 M2'),
('ACL-3382040385-4', '30201039'),
('ACL-4812070395-4 M1', '30102024'),
('ACL-4812070395-4 M3', '30102024'),
('ACL-4812070395-4 M2', '30170054')
如果我有创建 table 的数据,我希望能够获取 ACL-3382040385-4 的所有数据,直到只有 secondaryArt
以'30%'开头。
例如:
第一个 SELECT 语句:
SELECT t_mitm as MainArt, t_sitm as secondaryArt, t_qana as quantity
FROM ttibom010201
WHERE TRIM(t_mitm) = N'ACL-3382040385-4'
所以结果select是:
MainArt secondaryArt
ACL-3382040385-4 ACL-4812070395-4 M1
ACL-3382040385-4 ACL-4812070395-4 M3
ACL-3382040385-4 ACL-4812070395-4 M2
ACL-3382040385-4 30201039
第二个 SELECT 语句必须包含所有这些 M1、M2、M3 selected 以便它们将显示为 secondaryArt '30%'
SELECT t_mitm as MainArt, t_sitm as secondaryArt, t_qana as quantity
FROM ttibom010201
WHERE TRIM(t_mitm) = N'ACL-4812070395-4 M1'
SELECT t_mitm as MainArt, t_sitm as secondaryArt, t_qana as quantity
FROM ttibom010201
WHERE TRIM(t_mitm) = N'ACL-4812070395-4 M2'
SELECT t_mitm as MainArt, t_sitm as secondaryArt, t_qana as quantity
FROM ttibom010201
WHERE TRIM(t_mitm) = N'ACL-4812070395-4 M3'
最终结果必须如下所示:
ACL-3382040385-4 30201039 (FROM FIRST SELECT )
ACL-4812070395-4 M1 30102024 (FROM SECOND/LOOP SELECT )
ACL-4812070395-4 M2 30170054 (FROM SECOND/LOOP SELECT )
ACL-4812070395-4 M3 30102024 (FROM SECOND/LOOP SELECT )
您可以使用自 LEFT 连接来完成:
SELECT COALESCE(m2.MainArt, m1.MainArt) MainArt,
COALESCE(m2.secondaryArt, m1.secondaryArt) secondaryArt
FROM MyData m1 LEFT JOIN MyData m2
ON (m1.secondaryArt NOT LIKE '30%') AND (m2.MainArt = m1.secondaryArt)
WHERE TRIM(m1.MainArt) = 'ACL-3382040385-4'
ORDER BY COALESCE(m2.MainArt, m1.MainArt)
参见demo。
结果:
> MainArt | secondaryArt
> :------------------ | :-----------
> ACL-3382040385-4 | 30201039
> ACL-4812070395-4 M1 | 30102024
> ACL-4812070395-4 M2 | 30170054
> ACL-4812070395-4 M3 | 30102024
递归查询的场景。在您的示例中,只有 2 级场景,但它也适用于更深的级别。
如果您的 MySQL 版本是 8.0 那么您可以使用 Recursive CTE
:
with recursive cte as(
SELECT MainArt, secondaryArt
FROM MyData
WHERE TRIM(MainArt) = N'ACL-3382040385-4'
union all
select
MyData.MainArt, MyData.secondaryArt
from MyData inner join cte on cte.secondaryArt=MyData.mainArt
)
select * from cte where secondaryArt like '30%'
如果您的 MySql 版本是 5.X 那么您可以使用如下查询的变量方法:
select MainArt,
secondaryArt
from (select * from MyData
order by MainArt, secondaryArt) list_sorted,
(select @pv := 'ACL-3382040385-4') initialisation
where find_in_set(MainArt, @pv)
and length(@pv := concat(@pv, ',', secondaryArt)) and secondaryArt like '30%'
对于 Oracle 11g Release2 及更高版本:
with cte(MainArt,secondaryArt) as(
SELECT MainArt, secondaryArt
FROM MyData
WHERE TRIM(MainArt) = 'ACL-3382040385-4'
union all
select
MyData.MainArt, MyData.secondaryArt
from MyData inner join cte on cte.secondaryArt=MyData.mainArt
)
select * from cte where secondaryArt like '30%'
我只有一个 table 里面有所有需要的数据。最初的selection是这样的:
SELECT t_mitm as MainArt, t_sitm as secondaryArt, t_qana as quantity
FROM ttibom010201
WHERE TRIM(t_mitm) = N'ACL-3382040385-4'
returned 结果是:
MainArt secondaryArt Quantity
ACL-3382040385-4 ACL-4812070395-4 M1 1
ACL-3382040385-4 ACL-4812070395-4 M3 1
ACL-3382040385-4 ACL-4812070395-4 M2 1
ACL-3382040385-4 30201039 0,032
我想检查 secondaryArt
是否所有列的结果都以“30%”开头,并且它是否不以“30%”开头以对其执行完全相同的查询 - 这些示例应该前 3 行执行 3 次,因为
有 3 个元素不以 '30%' ( ACL-4812070395-4 M1 , ACL-4812070395-4 M3 , ACL-4812070395-4 M2).
这是第一行的例子。它必须执行:
select t_mitm as MainArt, t_sitm as secondaryArt, t_qana as quantity
from ttibom010201
where TRIM(t_mitm) = N'ACL-4812070395-4 M1'
所以这里也有机会 return 获取以 '30%' 或其他名称开头的 secondaryArt
数据。如果是其他情况,则必须再次执行这些查询以查找其中的元素。
基本上,最后所有 returned 元素应该有 secondaryArt
以 '30%' 开头
如何让它只在 SQL 中自动运行?是否可能,或者我应该从我的 JS 代码中 1 到 1 地获取数据?
更新:
CREATE TABLE IF NOT EXISTS `MyData` (
`MainArt` char(200) NOT NULL,
`secondaryArt` char(200) NOT NULL
)
INSERT INTO `MyData` (`MainArt`, `secondaryArt`) VALUES
('ACL-3382040385-4', 'ACL-4812070395-4 M1'),
('ACL-3382040385-4', 'ACL-4812070395-4 M3'),
('ACL-3382040385-4', 'ACL-4812070395-4 M2'),
('ACL-3382040385-4', '30201039'),
('ACL-4812070395-4 M1', '30102024'),
('ACL-4812070395-4 M3', '30102024'),
('ACL-4812070395-4 M2', '30170054')
如果我有创建 table 的数据,我希望能够获取 ACL-3382040385-4 的所有数据,直到只有 secondaryArt
以'30%'开头。
例如: 第一个 SELECT 语句:
SELECT t_mitm as MainArt, t_sitm as secondaryArt, t_qana as quantity
FROM ttibom010201
WHERE TRIM(t_mitm) = N'ACL-3382040385-4'
所以结果select是:
MainArt secondaryArt
ACL-3382040385-4 ACL-4812070395-4 M1
ACL-3382040385-4 ACL-4812070395-4 M3
ACL-3382040385-4 ACL-4812070395-4 M2
ACL-3382040385-4 30201039
第二个 SELECT 语句必须包含所有这些 M1、M2、M3 selected 以便它们将显示为 secondaryArt '30%'
SELECT t_mitm as MainArt, t_sitm as secondaryArt, t_qana as quantity
FROM ttibom010201
WHERE TRIM(t_mitm) = N'ACL-4812070395-4 M1'
SELECT t_mitm as MainArt, t_sitm as secondaryArt, t_qana as quantity
FROM ttibom010201
WHERE TRIM(t_mitm) = N'ACL-4812070395-4 M2'
SELECT t_mitm as MainArt, t_sitm as secondaryArt, t_qana as quantity
FROM ttibom010201
WHERE TRIM(t_mitm) = N'ACL-4812070395-4 M3'
最终结果必须如下所示:
ACL-3382040385-4 30201039 (FROM FIRST SELECT )
ACL-4812070395-4 M1 30102024 (FROM SECOND/LOOP SELECT )
ACL-4812070395-4 M2 30170054 (FROM SECOND/LOOP SELECT )
ACL-4812070395-4 M3 30102024 (FROM SECOND/LOOP SELECT )
您可以使用自 LEFT 连接来完成:
SELECT COALESCE(m2.MainArt, m1.MainArt) MainArt,
COALESCE(m2.secondaryArt, m1.secondaryArt) secondaryArt
FROM MyData m1 LEFT JOIN MyData m2
ON (m1.secondaryArt NOT LIKE '30%') AND (m2.MainArt = m1.secondaryArt)
WHERE TRIM(m1.MainArt) = 'ACL-3382040385-4'
ORDER BY COALESCE(m2.MainArt, m1.MainArt)
参见demo。
结果:
> MainArt | secondaryArt
> :------------------ | :-----------
> ACL-3382040385-4 | 30201039
> ACL-4812070395-4 M1 | 30102024
> ACL-4812070395-4 M2 | 30170054
> ACL-4812070395-4 M3 | 30102024
递归查询的场景。在您的示例中,只有 2 级场景,但它也适用于更深的级别。
如果您的 MySQL 版本是 8.0 那么您可以使用 Recursive CTE
:
with recursive cte as(
SELECT MainArt, secondaryArt
FROM MyData
WHERE TRIM(MainArt) = N'ACL-3382040385-4'
union all
select
MyData.MainArt, MyData.secondaryArt
from MyData inner join cte on cte.secondaryArt=MyData.mainArt
)
select * from cte where secondaryArt like '30%'
如果您的 MySql 版本是 5.X 那么您可以使用如下查询的变量方法:
select MainArt,
secondaryArt
from (select * from MyData
order by MainArt, secondaryArt) list_sorted,
(select @pv := 'ACL-3382040385-4') initialisation
where find_in_set(MainArt, @pv)
and length(@pv := concat(@pv, ',', secondaryArt)) and secondaryArt like '30%'
对于 Oracle 11g Release2 及更高版本:
with cte(MainArt,secondaryArt) as(
SELECT MainArt, secondaryArt
FROM MyData
WHERE TRIM(MainArt) = 'ACL-3382040385-4'
union all
select
MyData.MainArt, MyData.secondaryArt
from MyData inner join cte on cte.secondaryArt=MyData.mainArt
)
select * from cte where secondaryArt like '30%'