SQL Server:使用名称相同的列

时间:2016-07-20 17:42:14

标签: sql sql-server

我正在编写一个迁移脚本,以便在Microsoft SQL Server Management Studio中将数据从一种数据模型移动到另一种数据模型。我遇到的问题是,在源数据库中,一些表具有我需要比较的外键列。一段代码:

INSERT INTO TargetDB.dbo.Encounter(EncounterID, PATID, DRG)
Select
visit_occurrence_id,
person_id,
(Select
    Case when ((Select top 1 observation_concept_id from SourceDB.dbo.Observation where visit_occurrence_id = visit_occurrence_id) = 3040464)
    Then (Select top 1 value_as_string from SourceDB.dbo.Observation where visit_occurrence_id = visit_occurrence_id)
    Else NULL End
)
from SourceDB.dbo.Visit_occurrence

如您所见,我需要将SourceDB.dbo.Observation中的visit_occurrence_id与SourceDB.dbo.Visit_occurrence中的visit_occurrence_id进行比较。实际上,它只是从SourceDB.dbo.Observation中的第一行返回值,因为visit_occurrence_id将始终等于自己。

这样做的正确方法是什么?我可以将第一个visit_occurrence_id值分配给查询中的变量,因此它具有不同的名称吗?我在这里很丢失。

2 个答案:

答案 0 :(得分:0)

在评论中使用了snow_FFFFFF的答案:刚刚使用过SourceDB.dbo.Observation.visit_occurence_id。

答案 1 :(得分:0)

我将在答案中为您添加更多详细信息。您始终可以通过它的完全限定名称来引用对象,但它并不总是必要的:

Database.Schema.Table

Database.Schema.Table.Column

使用sql server,它甚至可以包含用于链接服务器方案的服务器。

对于其他对象也是如此,例如视图,过程,函数等。表和/或列的别名可能是缩短此限定条件的好策略。

任何时候都有歧义,这是必要的。但是,相当明确是一个好习惯,因为它可以为您节省未来的麻烦。例如,请考虑以下观点:

CREATE VIEW vwEmployeesWithLocation AS 
SELECT
  E.EmployeeId   -- from employees
  , LastName     -- from employees
  , Status       -- from employees
  , LocationName -- from locations
FROM
  Employees AS E
  INNER JOIN
  EmployeeLocations AS EL ON E.EmloyeeId = EL.EmployeeId
  INNER JOIN
  Locations AS L ON EL.LocationId = L.LocationId

现在,一切都很好,因为除了EmployeeId之外,列名称是不同的。但是,有人可能会在以后将“状态”列添加到“位置”表中并中断此视图。因此,最好明确包含select中所有列的表前缀。

在您的情况下,您的查询是跨数据库,因此请再次明确查询查询的所有部分中的数据库。