2010-06-17 10 views
1

J'ai un défi que j'ai pas surmonté dans les deux derniers jours à l'aide de procédures stockées SQL et 2008.table défi de soustraction

J'ai pris plusieurs approches, mais il faut deçà. Une approche très intéressante utilisait une soustraction de table.

C'est vraiment une question de soustraction de table.

Je me demandais si vous pouviez m'aider à craquer celui-ci.

Voici le défi:

Deux tables 1Testdb y 2Testdb.

Ma première étape consistait à sélectionner les relations d'ID ([2Testdb] .Acc_id) sur la table 2Testdb pour un individu donné ([2Testdb] .Bus_id). Ensuite, interrogez la table 1Testdb pour les enregistrements ne mesurant pas ma sélection d'origine à partir de 2Testdb.

Mais d'autres approches sont les bienvenues.

données et structures:

UTILISATION [Challengedb]

GO

SET ANSI_NULLS SUR

GO

SET quoted_identifier

GO

CREATE TABLE [dbo]. [1Testdb] (

 [Acc_id] [uniqueidentifier] NULL 

     [Name] [Varchar(10)] NULL 

) SUR [PRINCIPAL]

GO

CREATE TABLE [dbo]. [2Testdb] (

 [Acc_id] [uniqueidentifier] NULL, 

     [Bus_id] [uniqueidentifier] NULL 

) SUR [PRIMAIRE]

GO

dossiers sur 1Testdb:

34455F60-9474-4521-804E-66DB39A579F3, John

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

DC711615-3BE4-4B31-9EF2-B1314185CA62 , Dave

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

enregistrements sur 2Testdb: (tableau relation, ex.relations ami)

Fiche n ° 1: DC711615-3BE4-4B31-9EF2-B1314185CA62, 34455F60-9474-4521-804E-66DB39A579F3

Fiche n ° 2: E3AAB073-2398-476D-828B-92829F686A4C, 34455F60- 9474-4521-804E-66DB39A579F3

fiche n ° 3: DC711615-3BE4-4B31-9EF2-B1314185CA62, E3AAB073-2398-476D-828B-92829F686A4C

fiche n ° 4: E3AAB073-2398-476D-828B- 92829F686A4C, DC711615-3BE4-4B31-9EF2-B1314185CA62

Défi: Choisir parmi table 1Testdb uniquement les enregistrements distincts qui peuvent ne pas avoir de relation avec John [34455F60-9474-4521-804E-66DB39A579F3] sur la table 2Testdb.

Résultat attendu devrait être (qui ne John n'a pas relation avec?):

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

Merci, Valentin

Répondre

0

Non bien sûr ce que vous demandez; est-ce pour tous les utilisateurs de la première table qui n'ont pas d'amitié avec "John" basé sur la deuxième table?

Si, utilisez le « existe pas » mot-clé pour déterminer si oui ou non un enregistrement existe avec la requête donnée:

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

Merci pour la réponse rapide. Ceci est très proche du résultat cible. Seulement une partie du défi est qu'il apporte aussi le record de John. Comment exclure John de la réponse? [34455F60-9474-4521-804E-66DB39A579F3] Gardez à l'esprit que je veux seulement C23523F6-2309-4F58-BB3F-EF7486C7AF8B, Petes records Cordialement, Val – Val

+0

Le « et a.acc_id <> » ... "" à la fin devrait exclure la rangée de John. Est-ce que ça ne marche pas? Il a été édité plus tard, donc vous ne l'avez peut-être pas vu initialement. – MisterZimbu

+0

A vu la première fois. Mais ça a marché. Je vous remercie. Val – Val

0

Je ne sais pas comment vos colonnes sont mis en place ... ressemble GUID, mais c'est la syntaxe SQL Server pour le faire fonctionner. J'ai inclus un cas où John pourrait être dans la colonne Acc_id ou Bus_id, c'est pourquoi il y a 2 jointures au lieu d'une.

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

Génial! Merci, ça marche. – Val

+0

Content que cela fonctionne pour vous. Est-ce un système ami comme Facebook? – Jordan