如何通过查找每一行来填充另一个表格?

时间:2016-05-29 07:46:11

标签: sql sql-server

我有三张桌子:

CREATE TABLE [dbo].[Word] (
    [WordId]        INT            IDENTITY (1, 1) NOT NULL,
    [Word]          VARCHAR (20)   NOT NULL
)

CREATE TABLE [dbo].[Temp] (
    [HeaderWord]    VARCHAR (20) NOT NULL,
    [OtherWord]     VARCHAR (20) NULL
);


CREATE TABLE [dbo].[WordRelationship] (
    [HeaderWordId] INT NOT NULL,
    [OtherWordId]  INT NULL,
    CONSTRAINT [PK_WordRelationship] PRIMARY KEY CLUSTERED ([HeaderWordId] ASC, [OtherWordId] ASC)
);

第三个表是空的。有没有一种方法与SQL,而不是需要一个游标,我可以使用标题和其他单词的Id值填充WordRelationship表?请注意,在某些情况下,Temp2中的每一行可能没有OtherWord。此外,每个HeaderWord和OtherWord在Word表中都有一个条目。

这里是Word表的一些示例数据

WordId  Word
------  ----
5472    abandon
5473    abandoned
5474    abandoning
5475    abandonment
5476    abandons    
5477    abstraction 
5478    abstractions
5479    abstractly
5480    abstracts

这里有一些Temp Table

的样本数据
Header  Other
Word    Word
------- ----------
abandon abandoned
abandon abandoning
abandon abandonment
abandon abandons

2 个答案:

答案 0 :(得分:2)

尝试

INSERT INTO [dbo].[WordRelationship]
 SElECT a.WordId, b.WordId from [dbo].[Temp] t
 JOIN [dbo].{Word] a on t.HeaderWord = a.Word  
 LEFT JOIN [dbo].{Word] b on t.OtherWord = b.Word  

修改

在Join over Headerword中删除了LEFT,因为它在WordRelationship中是一个非空字段。

答案 1 :(得分:1)

INSERT INTO WordRelationship
SELECT DISTINCT a.WordId, b.WordId
FROM Temp t
INNER JOIN Word a
    ON t.HeaderWord = a.Word
INNER JOIN Word b
    ON t.OtherWord = b.Word

您需要DISTINCT因为Temp表格中可能存在重复项。我还建议INNER JOIN,如果Temp表中的Word表中没有单词,它将消除空值。