微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据外键关系使用另一个表中的值填充新表

如何解决根据外键关系使用另一个表中的值填充新表

我有一个连接到 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 举报,一经查实,本站将立刻删除。