PostgreSQL Выберите выписку с объединениями - PullRequest
0 голосов
/ 19 апреля 2020

Я довольно новичок в выборе SQL и пытаюсь выбрать из нескольких таблиц, чтобы показать все результаты из таблицы sync_lwcf_annual_inspection_report_for_active_grants со столбцами из других таблиц, добавленных там, где есть совпадающие значения. Если совпадение не найдено, это нормально, если оно показывает ноль, а sync_lwcf_annual_inspection_report_for_active_grants не пропускаются и не дублируются. Ниже приведен код, который я пробовал. Кроме того, я безуспешно пытался использовать некоторые левые внешние соединения. Любая помощь будет оценена.

SELECT
sync_lwcf_annual_inspection_report_for_active_grants.projectnum,
sync_lwcf_annual_inspection_report_for_active_grants.projectnumother,
sync_lwcf_annual_inspection_report_for_active_grants.projecttitle,
sync_lwcf_annual_inspection_report_for_active_grants.projectother,
sync_lwcf_annual_inspection_report_for_active_grants.annual_inspect,
sync_lwcf_annual_inspection_report_for_active_grants.inspect_date,
sync_lwcf_annual_inspection_report_for_active_grants.past_assistance,
sync_lwcf_annual_inspection_report_for_active_grants.public_rec,
sync_lwcf_annual_inspection_report_for_active_grants.park_maintained,
sync_lwcf_annual_inspection_report_for_active_grants.lwfc_sign,
sync_lwcf_annual_inspection_report_for_active_grants.q1a,
sync_lwcf_annual_inspection_report_for_active_grants.q1b,
sync_lwcf_annual_inspection_report_for_active_grants.q2a,
sync_lwcf_annual_inspection_report_for_active_grants.q2b,
sync_lwcf_annual_inspection_report_for_active_grants.q3a,
sync_lwcf_annual_inspection_report_for_active_grants.q3b,
sync_lwcf_annual_inspection_report_for_active_grants.q3c,
sync_lwcf_annual_inspection_report_for_active_grants.q3d,
sync_lwcf_annual_inspection_report_for_active_grants.q3e,
sync_lwcf_annual_inspection_report_for_active_grants.q3f,
sync_lwcf_annual_inspection_report_for_active_grants.q4,
sync_lwcf_annual_inspection_report_for_active_grants.q5,
sync_lwcf_annual_inspection_report_for_active_grants.q6a,
sync_lwcf_annual_inspection_report_for_active_grants.q6b,
sync_lwcf_annual_inspection_report_for_active_grants.q6c,
sync_lwcf_annual_inspection_report_for_active_grants.attest,
sync_lwcf_annual_inspection_report_for_active_grants.attestdate,
sync_lwcf_annual_inspection_report_for_active_grants.localcontact,
sync_lwcf_annual_inspection_report_for_active_grants.regconname,
sync_lwcf_annual_inspection_report_for_active_grants.regcontitle,
tbl_lwcf.status,
tbl_lwcf.grantee,
fc_nc_counties.name_locas,
fc_nc_counties.rrs_regions

FROM
sync_lwcf_annual_inspection_report_for_active_grants,
fc_nc_counties,
tbl_lwcf,
fc_lwcf_grant_boundaries,
fc_lwcf_grant_points,
fc_lwcf_rrs_regions

WHERE
tbl_lwcf.projectnbr37 = fc_lwcf_grant_points.projectid
AND 
fc_lwcf_grant_boundaries.projectid = tbl_lwcf.projectnbr37
AND 
fc_lwcf_grant_boundaries.rrs_regions = fc_lwcf_rrs_regions.rrs_regions
AND
fc_nc_counties.rrs_regions = fc_lwcf_rrs_regions.rrs_regions
AND
sync_lwcf_annual_inspection_report_for_active_grants.projectnum = fc_lwcf_grant_points.projectid

1 Ответ

1 голос
/ 19 апреля 2020

Вот как можно написать соединение между человеком и работой, имея в виду, что не у каждого человека есть работа. Он создает список всех людей и для каждого человека, у которого есть работа, информация о работе или все пустые значения в столбцах работы, если у них нет работы:

SELECT * 
FROM
  person p
  LEFT JOIN job j ON p.jobid = j.id

Не имеет значения, в какую сторону Предикат (j.id = p.jobid в порядке)

Левая таблица определяется как таблица перед словами LEFT JOIN. Левая таблица в левом соединении - это таблица "solid" - все ее строки, которые соответствуют предложению where, будут представлены. Правая таблица - это та, которая упоминается после слов RIGHT JOIN, и та, которая может стать разреженной / иметь нулевые значения во всех своих столбцах, если справа нет соответствующей строки для строки слева

Не пишите предложение where, которое затем указывает предикат в правой таблице, потому что это приведет к тому, что значения null снова исчезнут (левое соединение будет вести себя как внутреннее соединение), если только у вас нет «or righttable.column is null», которое излишне многословно и также нуждается в тщательном заключить в скобки, если есть несколько предикатов.

Если вам нужно указать что-то, что ограничивает строки в правой таблице, вместо этого сделайте это как часть предложения ON. Вот пример запроса, который находит все 1000 человек плюс только те 100 сведений о вакансиях, где это тип работы квалифицированный вручную :

--yes, produces all 1000 people and 900 null job infos, 100 manualskilled job infos
SELECT * 
FROM
  person p
  LEFT JOIN job j ON p.jobid = j.id AND j.jobtype ='manualskilled'


--no, produces just 100 rows, 900 people are missing
SELECT * 
FROM
  person p
  LEFT JOIN job j ON p.jobid = j.id
WHERE
  j.jobtype = 'manualskilled'

Это происходит потому, что в типе задания NULL, введенный левым соединением, удаляется при сравнении с константной строкой 'manualskilled'. Все, что сравнивается с NULL, неизвестно, что никогда не соответствует действительности. То, что не соответствует истине в предложении where, не может превратить его в выходной набор результатов, как вы сейчас обнаруживаете в своем запросе!

О, и последний момент, о котором стоит упомянуть; будьте осторожны при смешивании внутренних, левых и правых объединений, поскольку это может оказать глубокое влияние на вывод запроса. Вы, вероятно, будете ближе всего к тому, что вы логически ожидаете, если сначала выполните все свои внутренние объединения, затем свои левые, и если вам нужно объединить какие-либо таблицы в таблицу, к которой вы уже присоединились, то снова используйте левое соединение. Избегайте использования правых соединений вообще (перепишите их наоборот, чтобы они были левыми). Если вы внутренне соединяете таблицу с таблицей, которая была оставлена ​​объединенной, строки снова исчезнут, так как «ноль не может быть сопоставлен с другим значением и будет получено истинное значение»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...