我正在编写一个迁移脚本,以便在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值分配给查询中的变量,因此它具有不同的名称吗?我在这里很丢失。
答案 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中所有列的表前缀。
在您的情况下,您的查询是跨数据库,因此请再次明确查询查询的所有部分中的数据库。