Получение информации из разных таблиц в базе данных - PullRequest
0 голосов
/ 18 августа 2010

У меня есть две таблицы:

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

Пример данных : (1, airtel, '9887456321,6985326598,88523695874')

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

Пример данных : (1,John Doe, 9887456321)

Я хочу найти имя клиента из первой таблицы на основе значения мобильного поля.

Если мобильное поле имеет значения (9887456321,6985326598,88523695874), то как узнать, какое имя клиента у данного мобильного телефона?номер принадлежит?

1 Ответ

1 голос
/ 18 августа 2010

Между вашей таблицей client и другой таблицей должен быть соответствующий столбец. Из вашего описания не ясно, что это за столбец. Из того, что вы сказали, я считаю, что ваша схема выглядит так:

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
)

Предполагая, что Client.Mobile соответствует MobileNumbers.Name, у нас есть:

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

В этой структуре я предполагаю, что каждое значение Mobile содержит одно число, а не список чисел, разделенных запятыми. Если это действительно так, что одна ячейка может содержать несколько значений (пожалуйста, отредактируйте исходное сообщение в этом случае), то, как отметил Мартин Смит, вам нужно нормализовать данные.

EDIT

Учитывая вашу ревизию OP, основная проблема заключается в том, что у вас есть несколько значений в одном столбце. Правильным решением было бы нормализовать номера мобильных телефонов во второй таблице:

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

Тогда решение становится тривиальным:

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

Однако, тем временем, вам нужна функция разделения:

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
    )

Теперь вы можете сделать что-то вроде:

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...