Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将表与以前的版本联接_Sql - Fatal编程技术网

Sql 将表与以前的版本联接

Sql 将表与以前的版本联接,sql,Sql,我们对以前使用Access现在使用SQL的专有程序进行了升级。表模式完全相同,但问题是当我们切换到SQL时主键重新启动。我已将旧的access数据库导入数据库中的另一个sql表中。当前(基于SQL的)表名为Archive,导入的Access表名为ArchivePreSQL。我试图做的是创建一个连接这两个表的查询(因此我在一个查询中有所有记录),如果主键来自SQL表,则在主键上添加一个“S”,如果主键来自导入的Access表,则在主键上添加一个“a”。有可能这样做吗 我可以像这样获得第一个数据块,

我们对以前使用Access现在使用SQL的专有程序进行了升级。表模式完全相同,但问题是当我们切换到SQL时主键重新启动。我已将旧的access数据库导入数据库中的另一个sql表中。当前(基于SQL的)表名为Archive,导入的Access表名为ArchivePreSQL。我试图做的是创建一个连接这两个表的查询(因此我在一个查询中有所有记录),如果主键来自SQL表,则在主键上添加一个“S”,如果主键来自导入的Access表,则在主键上添加一个“a”。有可能这样做吗

我可以像这样获得第一个数据块,但我不确定如何按照我的意愿将其与第二个表连接起来

选择“S”+CAST(id为varchar(MAX))作为id、帐户、账单号、TakenTimestamp 从档案


非常感谢您的帮助

我想你应该使用一个
联合体
。其思想是,您有两个(或更多)的
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
填充新数据的表。