表减法挑战

时间:2010-06-17 17:19:56

标签: datatable

我在过去两天使用存储过程和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,John

C23523F6-2309-4F58-BB3F-EF7486C7AF8B,Pete

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

E3AAB073-2398-476D-828B-92829F686A4C,Adam

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,Pete

谢谢你, 的Valentin

2 个答案:

答案 0 :(得分:0)

不确定你在问什么;是第一个表中的所有用户都没有基于第二个表与“John”的友谊?

如果是,请使用“not exists”关键字来确定给定查询是否存在记录:

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'

答案 1 :(得分: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