嵌套 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%'

DEMO

对于 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%'