Иногда требуется сделать так, чтобы результат запроса по нескольким родительским таблицам выглядел так, как если бы родительские таблицы хранились в одной таблице (см. «Наследование одиночной таблицы»). Это можно осуществить двумя способами.
Сначала взгляните на следующий запрос, использующий оператор UNION: Файл npwwpa:_Polymorphic/soln/reverse-union.sql
SELECT b.issue_id, b.description, b.reporter, b.priority, b. status,
b.severity, b.version_affected, NULL AS sponsor FROM Comments AS с
JOIN (BugsComments JOIN Bugs AS b USING (issue_id)) USING (comment_id) WHERE c.comment_id = 9876;
UNION
SELECT f.issue_id, f.description, f.reporter, f.priority, f.status,
NULL AS severity, NULL AS version_affected, f.sponsor FROM Comments AS с
JOIN (FeaturesComments JOIN FeatureRequests AS f USING (issue_id))
USING (comment_id) WHERE c.comment_id = 987 6;
Данный запрос должен гарантированно возвращать одиночную строку, если каждый комментарий связывается приложением исключительно с одной родительской таблицей. Так как результаты запроса могут объединяться с помощью оператора UNION только в том случае, если их столбцы одинаковы по количеству и типу данных, необходимо предоставить заполнители NULL для столбцов, которые являются уникальными для каждой родительской таблицы. Столбцы следует перечислять в одном и том же порядке в обоих запросах, задействованных в операторе UNION. |