Запись без пары в выборке в Dart
INNER JOIN отбрасывает родителя, у которого
нет ни одной дочерней записи. LEFT JOIN
оставляет все строки левой таблицы, а поля правой
заполняет NULL, если пара не найдена.
Категория без товаров все равно попадает в результат, а имя товара читают с проверкой на пустоту:
import 'package:sqlite3/sqlite3.dart';
var db = sqlite3.open('left_catalog.db');
db.execute('PRAGMA foreign_keys = ON');
db.execute('''
CREATE TABLE IF NOT EXISTS categories (
id INTEGER PRIMARY KEY,
label TEXT NOT NULL
)
''');
db.execute('''
CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY,
category_id INTEGER NOT NULL,
sku TEXT NOT NULL,
FOREIGN KEY (category_id)
REFERENCES categories (id)
)
''');
db.execute(
'INSERT INTO categories (label) VALUES (?)',
['Tools'],
);
db.execute(
'INSERT INTO categories (label) VALUES (?)',
['Empty shelf'],
);
db.execute(
'INSERT INTO products (category_id, sku) VALUES (?, ?)',
[1, 'T-100'],
);
var rows = db.select('''
SELECT c.label, p.sku
FROM categories c
LEFT JOIN products p
ON p.category_id = c.id
ORDER BY c.id, p.id
''');
for (var row in rows) {
print(row['label']);
print(row['sku'] ?? 'no sku');
}
db.dispose();
Строка с id 2 дает null
в sku. Сравнение с null после
чтения подтверждает отсутствие значения:
import 'package:sqlite3/sqlite3.dart';
var db = sqlite3.open('left_null.db');
db.execute('PRAGMA foreign_keys = ON');
db.execute('''
CREATE TABLE IF NOT EXISTS categories (
id INTEGER PRIMARY KEY,
label TEXT NOT NULL
)
''');
db.execute('''
CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY,
category_id INTEGER NOT NULL,
sku TEXT NOT NULL,
FOREIGN KEY (category_id)
REFERENCES categories (id)
)
''');
db.execute(
'INSERT INTO categories (label) VALUES (?)',
['Empty shelf'],
);
var rows = db.select('''
SELECT c.label, p.sku
FROM categories c
LEFT JOIN products p
ON p.category_id = c.id
WHERE c.label = 'Empty shelf'
''');
if (rows.isNotEmpty) {
var sku = rows.first['sku'];
print(sku == null);
}
db.dispose();
В left_catalog.db добавьте категорию
"Spare" без товаров. Выведите ее
метку и "no sku", если артикул пуст.
Создайте left_teams.db с таблицами
teams и members. Одна команда
без участников должна появиться в выводе с
пустым именем участника.