Есть ли ярлык для нормализации таблицы, где столбцы = строки? - PullRequest
5 голосов
/ 26 июля 2010

Предположим, у вас есть таблица mySQL, описывающая, можете ли вы смешать два вещества

Product   A    B    C
---------------------
A         y    n    y
B         n    y    y
C         y    y    y

Первым шагом было бы преобразовать его в

P1   P2   ?
-----------
A    A    y
A    B    n
A    C    y
B    A    y
B    B    y
B    C    n
C    A    y
C    B    n
C    C    y

Но тогда у вас есть дублирующаяся информация.(Например, если A может смешиваться с B, то B может смешиваться с A), поэтому вы можете удалить несколько строк, чтобы получить

P1   P2   ?
-----------
A    A    y
A    B    n
A    C    y
B    B    y
B    C    n
C    C    y

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

Спасибо, надеюсь, мой вопрос имеет смысл, поскольку я все еще изучаю базы данных

Ответы [ 3 ]

4 голосов
/ 26 июля 2010

Если можно с уверенностью предположить, что вы начинаете со всех удвоенных отношений, например,

Если в таблице указано A B, то в таблице гарантированно будет B A.

Тогда все, что вам нужно сделать, это удалить все строки, где P2

DELETE FROM `table_name` WHERE `P2` < `P1`;

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

2 голосов
/ 26 июля 2010

Я не думаю, что это необходимо в вашей ситуации, но в качестве интеллектуального упражнения вы могли бы использовать решение Джейми Вонга и предотвратить удаление недублированных столбцов с помощью предложения EXISTS.Примерно так:

DELETE FROM `table_name` AS t1
  WHERE `P2` < `P1`
    AND EXISTS (SELECT NULL FROM `table_name` AS t2
      WHERE t1.`P1` = t2.`P2` AND t1.`P2` = t2.`P1`);

Перед тем, как что-либо удалять, он просто проверяет наличие дубликата.

(Мой синтаксис MySQL может быть немного неактивным; это было давно.)

1 голос
/ 26 июля 2010

Шаг 1 (как вы уже сделали): преобразование в Table2

P1   P2   ?
-----------
A    A    y
A    B    n
A    C    y
B    A    y
B    B    y
B    C    n
C    A    y
C    B    n
C    C    y

Шаг 2: Изменить порядок столбцов, выберите Различный

SELECT DISTINCT
   IF P1<P2 THEN P1 ELSE P2 END as P1, -- this puts the smallest value in P1
   IF P1>P2 THEN P1 ELSE P2 END as P2 -- this puts the largest value in P2
FROM Table2
WHERE NOT P1=P2  --(Assuming records like A, A, y are not interesting)

Я не парень из MySQL, поэтому вам может понадобиться проверить синтаксис if / then, но в любом случае это кажется концептуально нормальным.

...