Дублирование строк в SQL-запросе - PullRequest
0 голосов
/ 09 августа 2011

У меня есть таблица, содержащая несколько полей. Первичный ключ - userId. В настоящее время столбец user id содержит значения «1,2,3,4 ... etc», например:

+------+
|userId|
+------+
|  1   |
|  2   |
|  3   |
|  4   | 
...etc

Теперь я хочу добавить новые строки, оканчивающиеся на a, b, c, примерно так:

+------+
|userId|
+------+
|  1   |
|  1a  |
|  1b  |
|  1c  | 
|  2   |
|  2a  |
|  2b  |
|  2c  | 
...etc

Новые строки должны быть идентичны их родительской строке, за исключением идентификатора пользователя. (т.е. 1a, 1b и 1c должны соответствовать 1)

Также я не могу гарантировать, что в столбце идентификатора пользователя уже не будет нескольких «a», «b» или «c».

Есть ли способ написать SQL-запрос, чтобы сделать это быстро и легко?

Ответы [ 3 ]

3 голосов
/ 09 августа 2011

НЕ ДЕЛАЙТЕ ЭТОГО, вы столкнетесь с большим количеством проблем, чем та, которую вы пытаетесь решить!

добавьте новый столбец для хранения письма и сделайте так, чтобы первичный ключ закрывал исходный идентификатор пользователя и этот новый столбец.

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

1 голос
/ 09 августа 2011

Я согласен с КМ.Я не уверен, почему вы создаете эти дубликаты / составные идентификаторы, но мне кажется, что это неудобное направление.

При этом нужно преодолеть только одну проблему;По-видимому, вы не можете выбрать из и вставить в ту же таблицу в MySQL.

Итак, вам нужно сначала вставить во временную таблицу, а затем вставить в реальную таблицу ...

CREATE Temporary TABLE MyNewUserIDs (
  UserID    VARCHAR(32)
)

INSERT INTO
  myNewUserIDs
SELECT
  CONCAT(myTable.UserID, suffix.val)
FROM
  myTable
INNER JOIN
  (SELECT 'A' as val UNION ALL SELECT 'B' UNION ALL SELECT 'C' UNION ALL SELECT 'D') AS suffix
    ON RIGHT(myTable.UserID, 1) <> Suffix.val
WHERE
  NOT EXISTS (SELECT * FROM myTable AS lookup WHERE UserID = CONCAT(myTable.UserID, suffix.val))

INSERT INTO
  myTable
SELECT
  UserID
FROM
  MyNewUserIDs

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

0 голосов
/ 09 августа 2011

Это довольно просто с точки зрения SQL для генерации дополнительных строк: я сделаю это здесь

@ Ответ Km говорит вам, как сохранить его как 2 различных значения, которые я здесь предположил. Не стесняйтесь объединять идентификаторы пользователей и суффиксы, если хотите.

INSERT myTable (userid, suffix, co11, col2, ...coln)
SELECT M.userid, X.suffix, M.col1, M.col2, ..., M.coln
FROM
    myTable M
    CROSS JOIN
    (SELECT 'a' AS Suffix UNION ALL SELECT 'b' UNION ALL SELECT 'c') X
WHERE
    NOT EXISTS (SELECT *
          FROM
             MyTable M2
          WHERE
             M2.userid = M.userid ANS M2.Suffix = X.Suffix)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...