如何解决根据外键关系使用另一个表中的值填充新表
我有一个连接到 QGIS 的 sql Server 数据库。我正在使用 sql Server Management Studio,尝试使用另一个表中的值填充新表中的列。我知道创建视图是更好的做法,但是当我尝试将视图加载到 QGIS 中时,它返回以下错误消息:
Layer is not valid: The layer dbname='MBA-LBA_Ornaments'
host=DESKTOP-DLA7UV8 estimatedMetadata=true
srid=4326 type=Point disableInvalidGeometryHandling='1'
primaryKeyInGeometryColumns='0' table="dbo".
"GoldWeight" (Geo4) is not a valid layer and can not be added to the map.
Reason: No primary key Could be found on table GoldWeight
我能想到的唯一解决方法是创建一个新表,合并来自 Ornaments 表和 Sites 表的字段。以下是相关表的结构:
CREATE TABLE [dbo].[Ornaments](
[OrnID] [smallint] IDENTITY(1000,1) NOT NULL,[OrnForm] [varchar](20),[OrnSubtype] [varchar](20),[FragmentYN] [char](1),[Material] [varchar](30),[Period] [varchar](10),[Phase] [varchar](20),[BasisOfDate] [varchar](50),[SiteID] [smallint],[discContext] [varchar](20),[discYear] [varchar](10),[SingleFindYN] [char](1),[brokenYN] [varchar](2),[distortedYN] [char](1),[WeightG] [numeric](8,2),[SpatialPrecisionrating] [char](1),[ImageYN] [char](1),[Comments] [varchar](500),CREATE TABLE [dbo].[Sites](
[SiteID] [smallint] IDENTITY(1,[SiteName] [varchar](50),[SiteType] [varchar](50),[Region] [varchar](50),[Countydistrict] [nvarchar](30),[Latitude] [decimal](11,6),[Longitude] [decimal](11,[Geo4] AS (case when [Latitude] IS NOT NULL AND [Longitude] IS NOT NULL
then [geography]::Point([Latitude],[Longitude],(4326)) end),
GoldWeight 表是使用以下方法创建的:
SELECT SiteID,SUM(WeightG) AS 'Weight'
INTO GoldWeight
FROM Ornaments
WHERE Material = 'gold'
GROUP BY SiteID
然后我使用以下方法添加了 SiteName 和 Geo4 列:
ALTER TABLE GoldWeight
ADD SiteName VARCHAR(50) NULL,Geo4 geography NULL
ALTER TABLE GoldWeight
ADD FOREIGN KEY (SiteID) REFERENCES Sites(SiteID)
我认为添加外键会填充字段,但这当然不是真的。有没有办法根据 SiteID 外键关系用适当的数据填充 SiteName 和 Geo4 字段?
解决方法
这个查询应该可以达到目的,但是将数据复制到引用表并不是一个好习惯。
UPDATE G
SET G.SiteName = S.SiteName,G.Geo4 = S.Geo4
FROM GoldWeight G
INNER JOIN SITES S ON S.SiteID= G.SiteID
,
我最终想出了一个答案,即使用以下方法将视图中的结果选择到新表中:
SELECT dbo.GoldWeight.SiteID,dbo.GoldWeight.Weight,dbo.Sites.SiteName,dbo.Sites.SiteType,dbo.Sites.Region,dbo.Sites.CountyDistrict,dbo.Sites.Geo4
INTO GoldWeight2
FROM dbo.GoldWeight INNER JOIN
dbo.Sites ON dbo.GoldWeight.SiteID = dbo.Sites.SiteID
然后添加外键:
ALTER TABLE GoldWeight2
ADD FOREIGN KEY (SiteID) REFERENCES Sites(SiteID)
然后将 SiteID 列设置为 NOT NULL:
ALTER TABLE
QGIS_GoldWeight2
ALTER COLUMN
SiteID smallint NOT NULL;
然后将 SiteID 设置为主键:
ALTER TABLE QGIS_GoldWeight2
ADD PRIMARY KEY (SiteID);
我必须取消选中“工具”>“选项”>“设计器”下的“防止保存需要重新创建表的更改”框才能成功设置主键。
它创建了一个 QGIS 可以读取的表,但该表在导入 QGIS 后必须删除,因为如果 Sites 表中的字段更改,则数据不会更新。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。