2016-05-29 54 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中的非空字段,因此刪除了在加入標題詞中的左側。

相關問題