MWE
#!/usr/bin/env python3
import sqlite3
db = 'test.db'
conn = sqlite3.connect(db)
cur = conn.cursor()
# Create schema.
cur.execute('''CREATE TABLE IF NOT EXISTS objects (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
content TEXT NOT NULL,
parentid INTEGER NOT NULL,
UNIQUE(name)
)''')
conn.commit()
# Fill db.
data = [('obj1', 'hello', 0,),
('obj2', 'hi', 1,),
('obj3', 'aloha', 0)]
cur.executemany('INSERT OR IGNORE INTO objects (name, content, parentid) VALUES (?, ?, ?)',
(data))
conn.commit()
# Show objects table content as it is.
db_data = cur.execute('SELECT * FROM objects').fetchall()
print(db_data)
# Left self-join.
db_data2 = cur.execute('''SELECT o.id, o.name, od.name AS parentname
FROM objects AS o
LEFT JOIN objects AS od ON o.id = od.parentid''').fetchall()
print(db_data2)
Вывод
./test-sqlite-db.py
[(1, 'obj1', 'hello', 0), (2, 'obj2', 'hi', 1), (3, 'obj3', 'aloha', 0)]
[(1, 'obj1', 'obj2'), (2, 'obj2', None), (3, 'obj3', None)]
Получается, что parentid
совсем не parent, а child. Как заджоинить (универсально, чтобы остальные элементы выводились так же без доп. проверок и лишних итераций) так, чтобы вместо
[(1, 'obj1', >>>'obj2'<<<), (2, 'obj2', >>>None<<<), (3, 'obj3', None)]
стало
[(1, 'obj1',>>>None<<<), (2, 'obj2', >>>'obj1'<<<), (3, 'obj3', None)]
Очень желательно, чтобы все оставалось в рамках одной таблицы. Показывать нужно обязательно все записи, даже там, где нет parentid
.