2016-07-02 1 views
0

Supposons que nous ayons une table qui contient:Faire la projection d'un mode à l'aide requête SQL

UserID, ProjectID 

Ce tableau a une autre représentation dans l'analyse de réseau appelé bipartite graph.

Pouvons-nous faire une one mode projection efficace en utilisant requête SQL ?

Exemple d'une projection de mode: On suppose que la table est la suivante:

UserId, ProjectID 
U1, P1 
U2, P1 
U3, P1 
U4, P2 
U5, P2 
U1, P2 

La projection d'un mode de UserId est:

U1,U2 
U2,U3 
U3,U1 
U4,U5 
U4,U1 
U5,U1 

et de même, la projection d'un mode de ProjectID est:

P1,P2 

Répondre

2

Ceci est appelé join dans SQL:

select t1.UserId, t2.UserId 
from t t1 join 
    t t2 
    on t1.ProjectId = t2.ProjectId; 

Remarque: Si vous avez des paires qui sont connectés à travers plusieurs projets et vous ne voulez pas de doublons, puis utilisez select distinct.

+0

j'ai essayé l'option rejoindre, mais pour grand nombre de dossiers, il prend très très longtemps. Est-ce le moyen le plus efficace en sql? –

+1

Vérifiez ma réponse pour l'instruction WITH (NOLOCK) –

+1

@ M.M. . . Vous voulez être sûr que la table a un index sur 'ProjectId' (et mieux encore' (ProjectId, UserId) '). –

1

Utilisez ce qui suit pour l'accélérer. En appliquant l'instruction WITH (NOLOCK), SQL n'utilise aucun verrou de niveau de ligne, répondant plus rapidement.

select t1.UserId, t2.UserId 
from t t1 WITH (NOLOCK) join 
    t t2 WITH (NOLOCK) 
    on t1.ProjectId = t2.ProjectId; 

Merci à @Gordon Linoff pour la requête