2010-06-17 136 views
1

我有一個挑戰,我沒有在過去兩天使用存儲過程和SQL 2008克服。表減法挑戰

我採取了幾種方法,但必須失敗。

一個非常有趣的appraoch使用表減法。

這真的是關於表減法。

我想知道如果你能幫我解決這個問題。

我們的難題是:

兩個表1Testdbÿ2Testdb。

我的第一步是在表2Testdb中爲一個給定的個體([2Testdb] .Bus_id)選擇ID關係([2Testdb] .Acc_id)。然後查詢表1Testdb中的記錄,而不是從2Testdb中選擇我的原始選擇。

但是其他方法是受歡迎的。

數據與結構:

USE [Challengedb]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE TABLE [DBO]。[1Testdb](

 [Acc_id] [uniqueidentifier] NULL 

     [Name] [Varchar(10)] NULL 

)ON [PRIMARY]

GO

CREATE TABLE [DBO]。[2Testdb](

 [Acc_id] [uniqueidentifier] NULL, 

     [Bus_id] [uniqueidentifier] NULL 

)ON [PRIMARY]

GO

記錄上1Testdb:

34455F60-9474-4521-804E-66DB39A579F3,約翰

C23523F6-2309-4F58-BB3F-EF7486C7AF8B,皮特

DC711615-3BE4-4B31-9EF2,B1314185CA62戴夫

E3AAB073-2398-476D-828B-92829F686A4C,亞當

記錄上2Testdb:(關係表,恩。朋友關係)

記錄#1:DC711615-3BE4-4B31-9EF2-B1314185CA62,34455F60-9474-4521-804E-66DB39A579F3

記錄#2:E3AAB073-2398-476D-828B-92829F686A4C,34455F60- 9474-4521-804E-66DB39A579F3

記錄#3:DC711615-3BE4-4B31-9EF2-B1314185CA62,E3AAB073-2398-476D-828B-92829F686A4C

記錄#4:E3AAB073-2398-476D-828B- 92829F686A4C,DC711615-3BE4-4B31-9EF2-B1314185CA62

挑戰:從表1Testdb只有那些與表2Testdb上的John [34455F60-9474-4521-804E-66DB39A579F3]沒有關係的記錄不同。

預期結果應該是(誰不約翰沒有與關係?):

C23523F6-2309-4F58-BB3F-EF7486C7AF8B,皮特

謝謝 瓦倫丁

回答

0

不確定你正在問什麼;第一個表中的所有用戶是否與第二個表中的「John」沒有友誼?

如果是這樣,用「不存在」的關鍵字,以確定是否與給定的查詢存在一個記錄:

select a.* 
from [1testdb] a 
where not exists (
    select * from [2testdb] b where a.acc_id = b.acc_id and b.subid = '34455F60-9474-4521-804E-66DB39A579F3' 
) 
and a.acc_id <> '34455F60-9474-4521-804E-66DB39A579F3' 
+0

感謝您的快速回復。 這非常接近目標結果。 只剩下挑戰的一部分,它也帶來了約翰的記錄。 如何從答案中排除John? [34455F60-9474-4521-804E-66DB39A579F3] 記住我只想C23523F6-2309-4F58-BB3F-EF7486C7AF8B,Petes記錄 問候, 瓦爾 – Val 2010-06-17 17:45:36

+0

的「和a.acc_id <>」 ... ''在最後應該排除約翰的行。這不行嗎?它後來被編輯過,所以你最初可能沒有看到它。 – MisterZimbu 2010-06-17 17:49:07

+0

第一次看到了。但它的工作。謝謝。 Val – Val 2010-06-17 18:08:53

0

我不知道你的列是如何設置...看起來GUID,但是這是SQL Server語法來使其起作用。我列舉了John可以在Acc_id或Bus_id列中的情況,所以這就是爲什麼有2個連接而不是1個連接。

Declare @id NVarchar(50) 
Set @id = '34455F60-9474-4521-804E-66DB39A579F3' 

Select * 
From 1Testdb 
Left Outer Join 2Testdb As ForwardRelationship On ForwardRelationship.Acc_id = @id And ForwardRelationship.Bus_id = 1Testdb.Acc_id 
Left Outer Join 2Testdb As ReverseRelationship On ReverseRelationship.Bus_id = @id And ReverseRelationship.Acc_id = 1Testdb.Acc_id 
Where 
    ForwardRelationship.Acc_id Is Null And 
    ForwardRelationship.Bus_id Is Null And 
    ReverseRelationship.Acc_id Is Null And 
    ReverseRelationship.Bus_id Is Null And 
    1Testdb.Acc_id <> @id 
+0

太棒了!謝謝,它工作。 – Val 2010-06-17 17:52:11

+0

很高興它適合你。這是一個像Facebook這樣的好友系統嗎? – Jordan 2010-06-17 18:03:31