2010-08-18 6 views
0

J'ai deux tables:Obtenir des informations de différentes tables dans une base de données

 User 
--------------------- 
id  primary key 
name  varchar 
mobile varchar 

données Exemples: (1, airtel, '9887456321,6985326598,88523695874')

  Client 
--------------------------- 
id    primary key 
clientname  varchar 
mobileno  varchar 

données Exemples: (1,John Doe, 9887456321)

Je veux chercher le nom du client de la première table sur la base de la valeur du champ mobile.

Si le champ mobile a la valeur (9887456321,6985326598,88523695874), comment puis-je connaître le nom du client auquel ce numéro de téléphone appartient?

+1

Une seule valeur mobile peut-elle contenir trois virgules séparées par des nombres différents ou est-ce qu'il y a trois lignes avec les trois nombres mentionnés? – Thomas

+0

Merci George. Les choses semblent beaucoup plus claires après la modification. @Neo Certaines restructurations semblent définitivement en ordre. Quelle est la relation entre les utilisateurs, les clients et les mobiles? Est-ce qu'un client n'a qu'un seul mobile? Si oui, cela signifie-t-il toujours avoir un et un seul enregistrement correspondant dans la table des utilisateurs? –

Répondre

1

Il doit y avoir une colonne correspondante entre votre table client et l'autre table. Il ne ressort pas clairement de votre description quelle est cette colonne. D'après ce que vous avez dit, je crois que votre schéma ressemble à:

Create Table MobileNumbers 
(
    Id ... not null Primary Key 
    , Name varchar(??) not null 
    , Mobile varchar(??) not null 
) 

Create Table Client 
(
    Id ... not null Primary Key 
    , ClientName varchar(??) not null 
    , MobileNo varchar(??) not null 
) 

En supposant que Client.Mobile correspond MobileNumbers.Name, nous avons:

Select ... 
From Client 
    Join MobileNumbers 
     On MobileNumbers.MobileNo = Client.Mobile 
Where Client.Mobile In('9887456321','6985326598','88523695874') 

Dans cette structure, je suppose que chaque La valeur mobile contient un nombre unique et non une liste de nombres délimitée par des virgules. Si c'est effectivement le cas, une seule cellule peut contenir plusieurs valeurs (veuillez modifier votre message original, c'est le cas), alors comme Martin Smith l'a mentionné, vous devez normaliser les données.

EDIT

Compte tenu de votre révision de l'OP, la racine du problème est que vous avez plusieurs valeurs dans une seule colonne. La bonne solution serait de normaliser les numéros mobiles dans une seconde table:

Create Table UserMobileNumber 
(
    UserId ... not null References User (Id) 
    , Carrier varchar(??) not null 
    , Mobile varchar(??) not null 
    , Constraint UC_UserMobileNumber Unique (Mobile) 
) 

Ensuite, la solution devient trivial:

Select ... 
From User 
    Join UserMobileNumber 
     On UserMobileNumber.UserId = User.Id 
Where UserMobileNumber.Mobile In('9887456321','6985326598','88523695874') 

Toutefois, dans l'intervalle, ce que vous avez besoin est une fonction split:

Create Function dbo.udf_Split 
( 
    @DelimitedList nvarchar(max) 
    , @Delimiter nvarchar(2) = ',' 
) 
Returns Table 
As 
Return 
    (
    With CorrectedList As 
     (
     Select Case When Left(@DelimitedList, Len(@Delimiter)) <> @Delimiter Then @Delimiter Else '' End 
      + @DelimitedList 
      + Case When Right(@DelimitedList, Len(@Delimiter)) <> @Delimiter Then @Delimiter Else '' End 
      As List 
      , Len(@Delimiter) As DelimiterLen 
     ) 
     , Numbers As 
     (
     Select TOP (Len(@DelimitedList) + 2) Row_Number() Over (Order By c1.object_id) As Value 
     From sys.columns As c1 
      Cross Join sys.columns As c2 
     ) 
    Select CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen As Position 
     , Substring (
        CL.List 
        , CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen  
        , CharIndex(@Delimiter, CL.list, N.Value + 1)       
         - (CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen) 
        ) As Value 
    From CorrectedList As CL 
     Cross Join Numbers As N 
    Where N.Value < Len(CL.List) 
     And Substring(CL.List, N.Value, CL.DelimiterLen) = @Delimiter 
    ) 

maintenant, vous pouvez faire quelque chose comme:

Select ... 
From User 
    Outer Apply dbo.Split(User.Mobile) As M 
    Join Client 
     On Client.MobileNo = M.Value 
Where M.Value In('9887456321','6985326598','88523695874') 
Questions connexes