我想将数据从一个sql数据库导入到另一个。包含数据的数据库的结构与我现在拥有的数据库不同。
我的数据库具有表Person和Person_Data
人员专栏:
id(PK, int) | Person_Name(text)| Person_Data_id(FK, int)
Person_Data列:
Person_Data_id(PK, int) | Date_Of_Birth(text)| City_Of_Birth(text) | Favorite_City(text)|
另一个数据库具有必要的数据来填充此数据,但是结构有所不同。它具有这些表: ExternalPerson,ExternalProperty
ExternalPerson列:
|PersonID(PK, int) | Name(string) |
| 0 |"John" |
| 1 |"Bob" |
ExternalProperty列:
|PersonId|PropertyName|PropertyAttribute|PropertyValue|
| 0 |"Birth" | "City" |"Rome" |
| 1 |"Birth" | "City" |"Vienna" |
| 0 |"Birth" | "Date" |"1982-02-01" |
| 0 |"Favorite" | "City" |"New York" |
如您所见,外部数据库包含可以插入常规数据库中的信息。只是某些列存储在行中。我想将其合并,以便对于每个PersonID,我们选择“出生和城市”的值,并将其放入City_Of_Birth等中。外部数据库的结构使得PersonID,PropertName和PropertyAttribute的每个组合只有一行,因此没有歧义的风险。外部数据库中存在的PropertyName和PropertyAttribute的所有组合在Person_Data表中也具有相应的列。尽管可能缺少数据,例如,在我们的示例中,Bob没有出生日期或“最爱城市”的值,在这种情况下,这些条目应为空。也就是说,我想将两个表ExternalPerson和ExternalProperty转换为
|id(PK, int)|Name |Date_Of_Birth|City_Of_Birth|Favorite_City|
|auto |"John"|"1982-02-01" |"Rome" |"New York" |
|increment |"Bob" | NULL |"Vienna" |NULL |
我尝试了JOIN,GROUP BY,SELECT CASE WHEN和COALESCE的各种组合都无济于事。我觉得应该可以这样做,但是还没有成功找到将外部数据库中的行提取到列中的SQL命令。例如,线
SELECT
Name,
PropertValue AS City_Of_Birth
FROM
ExternalProperty
WHERE PropertyName LIKE 'Birth' AND PropertyAttribute LIKE 'City'
将在同一列中与City一起输出City_Of_Birth,但我不知道如何汇总结果。 是否有人对此有任何想法?预先感谢。
我正在使用Microsoft SQL Server Management Studio 2017和Microsoft SQL Server 2017(RTM)-14.0.1000.169(X64)
答案 0 :(得分:1)
您可以使用MAX()进行聚合
MAX(CASE WHEN PropertyName LIKE 'Birth' AND PropertyAttribute LIKE 'City' THEN PropertyValue ELSE NULL END) AS City_Of_Birth