Разница между текстовыми ссылками и ссылками int в SQLite?
Следующее утверждение работает:
SELECT p._id, last_name, first_name_pref, title, photo_big
FROM People p NATURAL JOIN SpecialtyAreas s
WHERE specialty_area_1 = (SELECT s._id FROM SpecialtyAreas s WHERE s.name = 'Customer Service')
ORDER BY last_name, first_name_pref;
Тем не менее, этот не делает:
SELECT p._id, last_name, first_name_pref, title, photo_big
FROM People p NATURAL JOIN Offices o
WHERE office = (SELECT o._id FROM Offices o WHERE o.name = 'Beadle County')
ORDER BY p.last_name, p.first_name_pref;
Единственное различие, которое я могу найти между двумя таблицами, состоит в том, что People.office
помечен как INTEGER REFERENCES "Offices._id"("")
в то время как People.specialty_area_1
помечен как TEXT REFERENCES "SpecialtyAreas._id"("").
Будет ли разница между типами данных вызвать эту проблему?
Кроме того, обе строки фактически находятся в базе данных.
Есть ли более простой способ сделать запрос к базе данных? specialty_areas
запрос выполняет то, что я хочу от него; Я просто пытаюсь выяснить, почему я не могу получить тот же результат от office
запрос.
1 ответ
Вы хотите, чтобы типы данных соответствовали столбцам родительской и дочерней таблиц, участвующим в отношениях внешнего ключа.
Простота часто в глазах смотрящего, но мне нравятся встроенные представления, так как они как бы самодокументируются:
select * from people p
join
(
select _id from people join offices
on people.office = offices._id
and offices.name = 'Beadle County'
UNION
select _id from people join specialtyareas
on people.specialty_area_1 = specialtyareas._id
and specialtyareas.name='Customer Service'
) as MatchingPeople
on MatchingPeople._id = p._id