LINUX.ORG.RU

sqlite3 left self-join, только наоборот

 , ,


0

1

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.



Последнее исправление: demonworm (всего исправлений: 1)