2016-05-29 53 views
1

我有三个表:如何从另一个表中查找每行的表格?

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表中都有一个条目。

这里的字表

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

这里是一些样本数据对临时表

Header Other 
Word Word 
------- ---------- 
abandon abandoned 
abandon abandoning 
abandon abandonment 
abandon abandons 
+0

你能解释一些样本数据吗? – Sachu

+0

呃... [CTE](https://technet.microsoft.com/en-us/library/ms186243%28v=sql.105%29.aspx)规则! –

+0

了解'LEFT JOIN'。 –

回答

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,如果在Word表中有Temp表没有字,它应该消除空值。

+0

由于“Temp中每行可能没有其他字母”,并且因为OtherWord是可空的,所以我认为这些行是需要的,并且为其他字写了LEFT JOIN, – Turo

+0

这两列都是主键的一部分,我记得他们可以在这种情况下不能为空。但是,如果我是的话,我可能会误会,请纠正我。 – gofr1

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 

编辑

由于它是WordRelationship中的非空字段,因此删除了在加入标题词中的左侧。

相关问题