sabines
Goto Top

SQL Tabelle mehrstufig durchsuchen

Moin,

ich habe eine Tabelle mit einer Zentrale die Filialen hat, die wiederum Unter Filialen hat, das könnte sich auch nach unten verlängern. Es handelt sich um eine Maria SQL DB, recht aktuelle Version.

Tabelle:

CREATE TABLE `filialen` (
	`lfdnr` INT(10) NOT NULL,
	`parentid` INT(5) NULL DEFAULT NULL,
	`name` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_bin',  
	PRIMARY KEY (`lfdnr`) USING BTREE
)
COLLATE='utf8_bin'  
ENGINE=MyISAM;

Inhalt:
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (211, 1, 'Zentrale');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (212, 211, 'Filiale-F2');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (213, 212, 'Filiale-F22');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (214, 211, 'Filiale-F3');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (215, 214, 'Filiale-F31');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (216, 212, 'Filiale-F21');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (218, 213, 'Filiale-F221');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (219, 213, 'Filiale-F222');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (220, 213, 'Filiale-F223');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (221, 213, 'Filiale-F224');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (222, 216, 'Filiale-F211');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (223, 216, 'Filiale-F21');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (224, 216, 'Filiale-F213');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (226, 214, 'Filiale-F32');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (227, 214, 'Filiale-F34');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (234, 211, 'Filiale-F1');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (250, 234, 'Filiale-F13');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (270, 234, 'Filiale-F11');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (272, 234, 'Filiale-F12');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (353, 234, 'Filiale-F16');  

tabellen

Ziel:
Finde zur Zentrale (lfdnr 211) die passenden Unterfilialen (212,214,234) und deren Unterfilialen (213,216+215,226,227+250,270,272,353) und so weiter.

Bisher habe ich das mit einem oder mehreren Subselects gemacht, was unübersichtlich und langsam und beim Hinzufügen einer Filialebene erweitert werden musste.

Gibt es irgendeine bequemere Möglichkeit die Tabelle "mehrfach" zu durchsuchen ohne den umständlichen Weg über subselects?

Grüße

Content-Key: 5056302178

Url: https://administrator.de/contentid/5056302178

Printed on: April 25, 2024 at 10:04 o'clock

Member: em-pie
Solution em-pie Dec 22, 2022 at 16:55:25 (UTC)
Goto Top
Moin,


Mithilfe einer CTE kannst du Tabellen rekursiv durchsuchen:
https://mariadb.com/kb/en/recursive-common-table-expressions-overview/

Bekomme das gerade nicht aus dem Kopf hin, mache das zu selten „aus dem Stehgreif“ aber auf diese Weise hab ich solche Themen schon häufig gelöst face-smile
Member: sabines
sabines Dec 24, 2022 at 08:25:16 (UTC)
Goto Top
Danke, das schaue ich mir nach Weihnachten mal an, in der Hoffnung ich kapiere das auchface-wink
Member: ukulele-7
ukulele-7 Dec 27, 2022 at 13:49:18 (UTC)
Goto Top
CTE ist das Mittel der Wahl, das mache ich ständig aber unter MSSQL face-smile Da gibt es auch noch Hierarchy ID, das ist aber auch nicht viel anders. Bei Problemen mit CTE einfach hier fragen.
Member: sabines
sabines Jan 02, 2023 at 15:30:44 (UTC)
Goto Top
Danke nochmal an die Hinweisgeber.

Falls jemand dieses Beispiel mal durchspielen möchte, hier eine mögliche Lösung:

WITH RECURSIVE kinder as ( 

   SELECT lfdnr as kind FROM filialen WHERE lfdnr=211

  UNION

   SELECT filialen.lfdnr FROM filialen JOIN kinder ON kinder.kind= filialen.parentid 

) 

SELECT * FROM kinder;