Sql 将表与以前的版本联接
我们对以前使用Access现在使用SQL的专有程序进行了升级。表模式完全相同,但问题是当我们切换到SQL时主键重新启动。我已将旧的access数据库导入数据库中的另一个sql表中。当前(基于SQL的)表名为Archive,导入的Access表名为ArchivePreSQL。我试图做的是创建一个连接这两个表的查询(因此我在一个查询中有所有记录),如果主键来自SQL表,则在主键上添加一个“S”,如果主键来自导入的Access表,则在主键上添加一个“a”。有可能这样做吗 我可以像这样获得第一个数据块,但我不确定如何按照我的意愿将其与第二个表连接起来 选择“S”+CAST(id为varchar(MAX))作为id、帐户、账单号、TakenTimestamp 从档案Sql 将表与以前的版本联接,sql,Sql,我们对以前使用Access现在使用SQL的专有程序进行了升级。表模式完全相同,但问题是当我们切换到SQL时主键重新启动。我已将旧的access数据库导入数据库中的另一个sql表中。当前(基于SQL的)表名为Archive,导入的Access表名为ArchivePreSQL。我试图做的是创建一个连接这两个表的查询(因此我在一个查询中有所有记录),如果主键来自SQL表,则在主键上添加一个“S”,如果主键来自导入的Access表,则在主键上添加一个“a”。有可能这样做吗 我可以像这样获得第一个数据块,
非常感谢您的帮助 我想你应该使用一个
联合体。其思想是,您有两个(或更多)的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
我想你应该使用一个联合体。其思想是,您有两个(或更多)的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
使用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
使用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
如果集合不相交,只需将所有集合合并即可:
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
如果集合不相交,只需将所有集合合并即可:
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
是的,你可以做到,这可以通过工会来实现
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表的最高标识的数字作为存档标识符的种子。假设您在ArchivePreSQL中有522行,然后将归档表种子设置为1000行。然后您就知道,任何低于1000的标识符都在ArchivePreSql表中,而不是在Archive表中
另外,不要忘记,您可以暂时禁用IdentityInsert功能并执行插入(包括标识符),然后重新启用Identity Insert功能(这是生成自动递增标识符字段的功能),这将允许您完全摆脱ArchivePreSQL表。若这是一个需要知道的问题,那个么您可以将其和重置标识插入种子值结合起来,以便新项目始终高于设定的数量。是的,您可以这样做,并且可以通过并集来完成
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
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
另一种选择是使用高于ArchivePreSQL表的最高标识的数字作为存档标识符的种子。假设您在ArchivePreSQL中有522行,然后将归档表种子设置为1000行。然后您就知道,任何低于1000的标识符都在ArchivePreSql表中,而不是在Archive表中
另外,不要忘记,您可以暂时禁用IdentityInsert功能并执行插入(包括标识符),然后重新启用Identity Insert功能(这是生成自动递增标识符字段的功能),这将允许您完全摆脱ArchivePreSQL表。若这是一个需要知道的问题,那个么您可以将其和重置Identity Insert种子值结合起来,以便新项目始终高于设定的数量
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前面加前缀,因为这样您就不能按它订购
我不建议在ID前面加前缀,因为这样您就不能按ID订购。为什么要按ID订购?它们通常不保证以任何特定的顺序排列,只是唯一的。然后,通过阅读第二列,可以明显看出哪里有重复或奇怪之处。处理隔离事物也比测试任意值的存在性更容易。为什么要按ID排序?它们通常不保证以任何特定的顺序排列,只是唯一的。然后,通过阅读第二列,可以明显看出哪里有重复或奇怪之处。它也更容易处理隔离问题,而不必使用子字符串来测试是否存在任意值。未格式化,但具有UNION ALL,并且确实提供了所需的列,而无需对要求进行二次猜测(我同意生成的列可能不太有用,但我会在注释中这样说)。请注意,对于硬编码的“S”和“A”,集合不能相交。@Philip
:所谓“集合不相交”,我的意思是存档
不包含来自存档的数据。E这是一个全新的表,不是从Access
导入并由SQL Server
填充新数据的表。没有格式化,但具有UNION ALL,并提供了所需的列,而无需对要求进行二次猜测(我同意生成的列可能不太有用,但我会在注释中这样说)。请注意,对于硬编码的“S”和“A”,集合不能相交。@Philip
:所谓“集合不相交”,我的意思是存档
不包含来自存档的数据。E这是一个全新的表,不是从Access
导入并由sqlserver
填充新数据的表。