2010-06-17 93 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