我们对以前使用Access并现在使用SQL的专有程序进行了升级。表模式完全相同,但问题是当我们切换到SQL时主键重新启动。我已将旧的访问数据库导入到数据库中的另一个sql表中。当前(基于SQL)表名为Archive,导入的Access表是ArchivePreSQL。我要做的是创建一个连接这两个表的查询(所以我在一个查询中有所有记录)并在主键中添加“S”(如果它来自SQL表)和“A”如果它是来自导入的Access表。有可能这样做吗?
我可以得到这样的第一个数据块,但我不确定如何用第二个表格加入我想要的数据。
SELECT'S'+ CAST(id AS varchar(MAX))AS id,Account,BillingNumber,TakenTimestamp 来自档案
非常感谢任何帮助!
答案 0 :(得分:2)
如果集合不相交,只需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 :(得分:2)
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 :(得分:1)
我想你想使用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
答案 3 :(得分:1)
是的,您可以这样做,并且可以通过联盟
完成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
另一个替代方案是使用比ArchivePreSQL表的最高标识更高的数字为ARCHIVE标识符设定种子。假设您在ArchivePreSQL中有522行然后将ARCHIVE表播种到1000.然后您知道1000以下的任何标识符都在ArchivePreSql表中而不是存档表。
另外,不要忘记您可以暂时禁用IdentityInsert功能并执行插入(包括标识符),然后重新启用Identity Insert功能(生成自动递增标识符字段的那个),这将是允许你完全摆脱ArchivePreSQL表。如果这是需要知道的问题,那么您可以将其与重置标识插入种子值相结合,以便新项目始终高于设定数量。
答案 4 :(得分:0)
使用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