Просматривайте таблицу и добавляйте записи в зависимости от условий

Table A (id, rollNumber, spaces)

пример данных

1 1 A
2 1 B
3 1 C
4 2 A
5 3 A

Для каждого рулонного номера должно быть 3 пробела, а именно: A, B, C. Однако в настоящее время записи не согласованы. У некоторых это есть, а у некоторых нет.

Мне нужно пройтись по таблице и добавить пробелы B, C для любого rollNumber, у которого его нет.

0
0
35
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

SELECT *
FROM
  (SELECT DISTINCT rollNumber FROM t) r
  CROSS JOIN
  (SELECT DISTINCT spaces FROM t) s
  LEFT JOIN t
    ON s.spaces = t.spaces
    AND r.rollNumber = t.rollNumber

Подтаблицы r и s извлекают все возможные значения для rollNumber и spaces; CROSS JOIN делает все возможные комбинации этих значений. LEFT JOIN с исходной таблицей затем предоставит вам все эти комбинации, заполненные исходными данными, где это возможно.

Я хочу внести эти записи в таблицу, а не просто запрашивать их

Aninda Choudhary 26.10.2018 06:36
Ответ принят как подходящий

Один из подходов - создать календарную таблицу, содержащую все отдельные данные, которые вы ожидаете увидеть. Затем используйте MINUS с INSERT INTO ... SELECT для заполнения недостающих данных.

INSERT INTO yourTable (rollNumber, spaces)
SELECT r.rollNumber, s.spaces
FROM
(
    SELECT DISTINCT rollNumber FROM yourTable
) r
CROSS JOIN
(
    SELECT 'A' AS spaces UNION ALL
    SELECT 'B' UNION ALL
    SELECT 'C'
) s
LEFT JOIN yourTable t
    ON r.rollNumber = t.rollNumber AND s.spaces = t.spaces
WHERE
    t.rollNumber IS NULL;

mysql, похоже, не распознает ключевое слово minus.

Aninda Choudhary 26.10.2018 06:35

@AnindaChoudhary Извините, я обновил свой ответ, чтобы вместо этого использовать соединение. Надеюсь, теперь это сработает.

Tim Biegeleisen 26.10.2018 06:39

работает отлично. Я застрял на этом долгое время из-за моих ограниченных знаний о базах данных. Спасибо

Aninda Choudhary 26.10.2018 06:54

Другие вопросы по теме