Присоединение к таблице с предыдущей версией - PullRequest
0 голосов
/ 25 августа 2009

Мы выполнили обновление проприетарной программы, которая раньше использовала Access, а теперь использует SQL. Схема таблицы точно такая же, но проблема в том, что первичный ключ перезагружается при переходе на SQL. Я импортировал старую базу данных доступа в другую таблицу SQL в базе данных. Текущая таблица (на основе SQL) называется Archive, а импортированная таблица Access - ArchivePreSQL. То, что я пытаюсь сделать, это создать запрос, который объединяет эти две таблицы (поэтому у меня есть все записи в одном запросе) и добавить «S» к первичному ключу, если он из таблицы SQL, и «A», если это из импортированной таблицы доступа. Возможно ли это сделать?

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

ВЫБРАТЬ 'S' + CAST (идентификатор AS varchar (MAX)) AS идентификатор, учетная запись, BillingNumber, TakenTimestamp ИЗ архива

Любая помощь с этим очень ценится!

Ответы [ 5 ]

2 голосов
/ 25 августа 2009
SELECT a.id, 
      'A',
       a.account, 
       a.billingnumber, 
       a.takentimestamp
  FROM ARCHIVE a
UNION ALL
SELECT b.id,
      'B',
       b.account, 
       b.billingnumber, 
       b.takentimestamp
  FROM ARCHIVEPRESQL b
 ORDER BY id

Я не рекомендую ставить префикс ID, потому что тогда вы не сможете его заказать.

2 голосов
/ 25 августа 2009

Если множества не пересекаются, просто UNION ALL их:

  SELECT 'S' + CAST(id AS varchar(MAX)) AS id, Account, BillingNumber, TakenTimestamp
  FROM Archive
  UNION ALL
  SELECT 'A' + CAST(id AS varchar(MAX)) AS id, Account, BillingNumber, TakenTimestamp
  FROM ArchivePreSQL
1 голос
/ 25 августа 2009

Да, вы можете сделать это, и это может быть достигнуто через Союз

SELECT 'S' + CAST(id AS varchar(MAX)) AS id, Account, BillingNumber, TakenTimestamp FROM Archive
union
SELECT 'A' + CAST(id AS varchar(MAX)) AS id, Account, BillingNumber, TakenTimestamp FROM ArchivePreSQL

Другой альтернативой будет заполнение вашего идентификатора ARCHIVE, скажем, числом, превышающим максимальный идентификатор таблицы ArchivePreSQL. Скажем, у вас есть 522 строки в ArchivePreSQL, а затем заполняйте таблицу ARCHIVE, скажем, 1000. Затем вы знаете, что любой идентификатор ниже 1000 находится в таблице ArchivePreSql, а не в таблице архива.

Кроме того, не забывайте, что вы можете временно отключить функцию IdentityInsert и выполнить вставки (включая идентификатор), а затем снова включить функцию вставки Identity (которая генерирует поле идентификатора с автоинкрементом), и это будет позволяют полностью избавиться от таблицы ArchivePreSQL. Если вам необходимо знать, вы можете связать это со сбросом начального значения Identity Insert, чтобы новые элементы всегда были выше установленного количества.

1 голос
/ 25 августа 2009

Я думаю, что вы хотите использовать UNION. Идея UNION состоит в том, что у вас есть два (или более) набора операторов SELECT, оба из которых должны возвращать одинаковое точное число столбцов с одинаковыми типами для каждого, и затем они получают соединены вместе.

Так, например:

SELECT 'S' + CAST(id AS varchar(MAX)) AS id, Account, BillingNumber, TakenTimestamp FROM Archive
UNION SELECT 'A' + CAST(id AS varchar(MAX)) AS id, Account, BillingNumber, TakenTimestamp FROM ArchivePreSQL
0 голосов
/ 25 августа 2009

Используйте ключевое слово UNION


SELECT 'S' + CAST(id AS varchar(MAX)) AS id,
       Account,
       BillingNumber,
       TakenTimestamp
FROM Archive
UNION
SELECT 'A' + CAST(id AS varchar(MAX)) AS id,
       Account,
       BillingNumber,
       TakenTimestamp
FROM ArchivePreSql
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...