Соединение связанных таблиц в Dart
Когда данные разнесены по таблицам, для отчета
нужны поля с обеих сторон. INNER JOIN
оставляет только те пары, где ключ ссылки совпал.
Выборка отделов и сотрудников с равенством идентификаторов выглядит так:
import 'package:sqlite3/sqlite3.dart';
var db = sqlite3.open('join_staff.db');
db.execute('PRAGMA foreign_keys = ON');
db.execute('''
CREATE TABLE IF NOT EXISTS departments (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL
)
''');
db.execute('''
CREATE TABLE IF NOT EXISTS staff (
id INTEGER PRIMARY KEY,
dept_id INTEGER NOT NULL,
full_name TEXT NOT NULL,
FOREIGN KEY (dept_id)
REFERENCES departments (id)
)
''');
db.execute(
'INSERT INTO departments (title) VALUES (?)',
['Support'],
);
db.execute(
'INSERT INTO staff (dept_id, full_name) VALUES (?, ?)',
[1, 'Alice Gray'],
);
db.execute(
'INSERT INTO staff (dept_id, full_name) VALUES (?, ?)',
[1, 'Ben Holt'],
);
var rows = db.select('''
SELECT s.full_name, d.title
FROM staff s
INNER JOIN departments d
ON s.dept_id = d.id
ORDER BY s.id
''');
for (var row in rows) {
print(row['full_name']);
print(row['title']);
}
db.dispose();
Псевдонимы s и d сокращают имена
столбцов. Фильтр по отделу задают в WHERE
после соединения:
import 'package:sqlite3/sqlite3.dart';
var db = sqlite3.open('join_filter.db');
db.execute('PRAGMA foreign_keys = ON');
db.execute('''
CREATE TABLE IF NOT EXISTS departments (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL
)
''');
db.execute('''
CREATE TABLE IF NOT EXISTS staff (
id INTEGER PRIMARY KEY,
dept_id INTEGER NOT NULL,
full_name TEXT NOT NULL,
FOREIGN KEY (dept_id)
REFERENCES departments (id)
)
''');
db.execute(
'INSERT INTO departments (title) VALUES (?)',
['Support'],
);
db.execute(
'INSERT INTO departments (title) VALUES (?)',
['Archive'],
);
db.execute(
'INSERT INTO staff (dept_id, full_name) VALUES (?, ?)',
[1, 'Alice Gray'],
);
db.execute(
'INSERT INTO staff (dept_id, full_name) VALUES (?, ?)',
[2, 'Cara Mint'],
);
var rows = db.select('''
SELECT s.full_name
FROM staff s
INNER JOIN departments d
ON s.dept_id = d.id
WHERE d.title = 'Support'
''');
for (var row in rows) {
print(row['full_name']);
}
db.dispose();
В join_staff.db добавьте отдел
"Sales" и сотрудника в нем. Выведите
имя и название отдела одной строкой на человека.
Создайте join_fleet.db с таблицами
garages и vehicles. Выведите
номер машины и код гаража для каждой пары.
В join_fleet.db оставьте в выводе
только машины гаража с кодом "G-7".