Добавление столбца в оператор выбора на основе существования записи в другой таблице - PullRequest
4 голосов
/ 07 марта 2011

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

Мой существующий SQL -

SELECT tabs.name,tabs.id AS tabid,tabs.sort,fields.id AS fieldid, fields.label
FROM tabs
INNER JOIN fields
  ON tabs.id = fields.tabid
LEFT JOIN fields_reports
  ON fields_reports.fieldid = fields.id
WHERE fields_reports.reportid = 57
GROUP BY fields.id
ORDER BY tabs.sort, fields.id

В SQL произошло то, что он извлекает поле (которое является ядром оператора) и вкладки (которые по сути являются категориями). Таблица fields_reports сопоставляет поля с отчетами, которые я создаю.

Что мне нужно сделать, так это добавить в мое утверждение столбец, в котором говорится: если в текущем поле есть запись в таблице fields_reports с номером отчета, переданным в (57), тогда присвойте значение столбца 1, иначе 0.

Редактировать: У меня есть другая проблема с запросом. В настоящее время запрос только извлекает поля, прикрепленные к одному отчету. Вместо использования регистра, есть ли способ сделать подзапрос для выбора из таблицы fields_reports, чтобы я мог извлечь все поля и затем добавить столбец к отчету?

Это запрос, который теперь извлекает записи, но извлекает только одно поле отчета.

SELECT tabs.name,tabs.id AS tabid,tabs.sort,fields.id AS fieldid, fields.label,
  CASE WHEN fields_reports.id IS null THEN 0 ELSE 1 END AS inReport
FROM fields
INNER JOIN tabs
  ON tabs.id = fields.tabid
LEFT JOIN fields_reports
  ON fields_reports.fieldid = fields.id
WHERE fields_reports.reportid = 57
GROUP BY fields.id
ORDER BY tabs.sort, fields.id

Дайте мне знать, если я открою новый вопрос для этого.

Ответы [ 3 ]

4 голосов
/ 07 марта 2011
You can `SELECT ..., IF(field_reports.reportid=57),1,0), ... FROM ...`

РЕДАКТИРОВАТЬ Тест репортажа в предложении WHERE необходимо будет удалить, иначе это не имеет смысла в качестве решения. (Спасибо @Dave Long за это.)

1 голос
/ 07 марта 2011

Посмотрите, что я сделал с вашим сценарием:

SELECT tabs.name,tabs.id AS tabid,tabs.sort,fields.id AS fieldid, fields.label
FROM tabs
INNER JOIN fields
  ON tabs.id = fields.tabid
LEFT JOIN fields_reports
  ON fields.id = fields.id AND fields_reports.reportid = 57
GROUP BY fields.id
ORDER BY tabs.sort, fields.id

Заметили что-то другое? Я удалил предложение WHERE и переместил условие в предложение ON LEFT JOIN fields_reports. WHERE, как было указано, превратило LEFT JOIN в INNER JOIN, поэтому результирующий набор будет пытаться выбрать строки только с fields_reports.reportid = 57 Если бы не было таких строк, ни одна из них не была бы возвращена, т. Е. Таким образом вы не могли бы работать с вашим столбцом флага.

Но теперь это можно определить, например, так:

MAX(CASE fields_reports.reportid WHEN 57 THEN 1 ELSE 0 END) AS TheFlagColumn

Просто добавьте его в список выбора.

0 голосов
/ 07 марта 2011

Фраза будет выглядеть следующим образом:

select ....
     , case when LeftJoinedTable.column is null then 0 else 1 end
  from ....

это работает, потому что, когда вы оставили соединение, и в объединенной таблице не осталось ни одной строки, столбцы все еще присутствуют в результате, но все они равны нулю.Таким образом, вы можете проверить это нулевое значение, чтобы проверить, соответствует ли вам строка в правой части объединения.

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