MySQL: как получить значение из таблицы, в которой есть повторяющиеся записи этого значения?

0

У меня есть SourceTable:

ColumnA   ColumnB   ColumnC   ...
1         a         apple
2         b         ball
3         c         car
4         a         apple
5         p         pizza

ColumnB и ColumnC имеют повторяющиеся значения.

Мой код:

INSERT INTO TargetTable
SELECT 'Bob', ColumnB, ColumnC, now(), ... FROM SourceTable
WHERE ColumnB = 'a';

Мне просто нужно ввести одно значение в TargetTable. Результат должен выглядеть примерно так:

Bob   a   apple   currentTime   ...

У TargetTable проблема: каждая запись TargetTable в TargetTable.

EDIT: btw, a в WHERE ColumnB = 'a'; является динамическим. Он изменяется в зависимости от взаимодействия пользователя.

Теги:

1 ответ

0
Лучший ответ

Ответ на теорию, без каких-либо знаний о вариантах использования, которые управляли дизайном БД

Этот сценарий часто можно избежать, разбив столбцы B и C в родительскую таблицу с помощью уникального ключа в столбцах B и C. Затем используйте столбец внешнего ключа в SourceTable для ссылки на родительскую таблицу.

Что касается вашего оператора INSERT, то столбец B и C будут ссылками на родительскую таблицу, где она гарантирует, что вы будете иметь уникальное значение столбца B и C, тем самым избегая дублирования ошибки ввода.

См. Https://en.wikipedia.org/wiki/Database_normalization в отношении сокращения избыточности данных, например дублированных значений столбца B и C (a, apple) в SourceTable.

Но если редизайн БД не является вариантом по той или иной причине...

Вы можете использовать SELECT DISTINCT

INSERT INTO TargetTable
SELECT 'Bob', ColumnB, ColumnC, now(), ... FROM (SELECT DISTINCT ColumnB, 
ColumnC from SourceTable) derived_table
WHERE ColumnB = 'a';
  • 0
    Извините за удивительный вопрос, но как выглядит производная таблица?
  • 0
    Не нужно извиняться за искренние вопросы. производная_таблица представляет собой псевдоним таблицы, полученной из подзапроса (SELECT DISTINCT ColumnB, ColumnC from SourceTable).
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню