#c# #sql #sqlite
#c# #sql #sqlite
Вопрос:
У меня есть структура данных связанного списка в C #, которая представляет собой своего рода цепочку. Теперь я хочу сопоставить эту цепочку с базой данных SQLite. У меня есть следующая схема:
-- Table: MetaData
CREATE TABLE MetaData (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
FrameId TEXT NOT NULL,
Unit INTEGER REFERENCES Units (Id)
NOT NULL,
Predecessor INTEGER REFERENCES Units (Id),
Name TEXT,
Value TEXT
);
-- Table: Units
CREATE TABLE Units (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
UnitName TEXT UNIQUE
);
Таким образом, каждая строка в таблице метаданных предлагает значение «Предшественник» в дополнение к значению «Единица измерения» (оба указывают на соответствующую запись в таблице «Единицы измерения»). Я подумал, что при таком подходе должно быть возможно пройти через «связанный список» (строки таблицы метаданных) до первой записи в цепочке. Теперь я ищу способ получить упорядоченный результат на основе значений «Предшественник» и «Единица измерения». Возможно ли это с помощью предложения «WITH» и рекурсии в SQL?
Я пробовал что-то подобное, но это не сработало, и я немного потерялся:
WITH RECURSIVE list AS (
SELECT Id, 1 AS Position, Unit, Predecessor
FROM MetaData WHERE Predecessor IS NULL
UNION ALL
SELECT m.Id, list.Position 1, m.Unit, m.Predecessor
FROM MetaData m INNER JOIN list mpl ON m.Id = mpl.Id AND m.Predecessor = mpl.Unit
)
SELECT * FROM list
Комментарии:
1. Опубликуйте образцы данных и ожидаемые результаты, лучше в скрипке: dbfiddle.uk/?rdbms=sqlite_3.27 чтобы уточнить, чего вы хотите.
2. В общем, такие вещи, как связанные списки и реляционные базы данных, плохо уживаются друг с другом. Рассмотрим дизайн, который сериализует ваш список в упорядоченную коллекцию, которую можно спроецировать в таблицу (и, э-э, непроецируемую, обратно в связанный список).
3. @forpas: Вы можете найти образец скрипки здесь: sqlfiddle.com /#!5/8085f/4