Как использовать отдельный с внутренним объединением, имеющим подзапрос - PullRequest
0 голосов
/ 22 марта 2011

Я хочу, чтобы UserId из таблицы транзакций был отличным, поэтому не могли бы вы сказать мне, как я могу получить отдельный идентификатор пользователя из таблицы транзакций, имеющей внутреннее соединение?

SELECT     TransactionMaster.TransId, TransactionMaster.UserId, TransactionMaster.SessionId, TransactionMaster.TotalAmount, TransactionMaster.PaymentStatus, 
                      TransactionMaster.TransDate, TransactionMaster.ShippingId, TransactionMaster.IPAddress, TransactionMaster.IsShipped, TransactionMaster.DeliveredDate, 
                      Register.ID, Register.Password, Register.FirstName, Register.LastName, Register.MiddleName, Register.Address, Register.CountryId, Register.StateId, 
                      Register.CityId, Register.Email, Register.Status, Register.IPAddress AS Expr1, Register.Account, Register.ZipCode
FROM         TransactionMaster INNER JOIN
                      Register ON TransactionMaster.UserId = Register.ID
WHERE(TransactionMaster.UserId IN (SELECT Distinct UserId FROM TransactionMaster WHERE TransactionMaster.UserId IN(SELECT  UserId FROM TransactionMaster)))

Прямо сейчас я получаю вывод:

**Transid                              UserId        sessioId            otherfields**

Ai36Lft9X4PrHg8p7BTs2n5K5Dcz4E        z8CFj92M     dzwsyf55s1io1e552ifty555
d3YAs6j4L2SxJm95PeDn78NbCq49By        f4M5Rmr9     1u0mkd45rt5jz455axcvbgbd
k6Z5LiYp39CnBs24Gca8D7Sfw8J6Xd        f4M5Rmr9     zo1gwz45gtbg3uegkkf21dmz

Но я хочу этот тип вывода

**Transid                                  UserId        sessioId       otherfields**

Ai36Lft9X4PrHg8p7BTs2n5K5Dcz4E        z8CFj92M     dzwsyf55s1io1e552ifty555
d3YAs6j4L2SxJm95PeDn78NbCq49By        f4M5Rmr9     1u0mkd45rt5jz455axcvbgbd

Ответы [ 3 ]

2 голосов
/ 22 марта 2011

Вы можете использовать cte и row_number () , чтобы получить различный идентификатор пользователя.Вот упрощенная версия, которую вы сможете применить к более сложному запросу.

declare @T table(TransID varchar(50), UserID varchar(8), SessionID varchar(50))

insert into @T values
('Ai36Lft9X4PrHg8p7BTs2n5K5Dcz4E',        'z8CFj92M',     'dzwsyf55s1io1e552ifty555'),
('d3YAs6j4L2SxJm95PeDn78NbCq49By',        'f4M5Rmr9',     '1u0mkd45rt5jz455axcvbgbd'),
('k6Z5LiYp39CnBs24Gca8D7Sfw8J6Xd',        'f4M5Rmr9',     'zo1gwz45gtbg3uegkkf21dmz')

;with cte as
(
  select
    *,
    row_number() over(partition by UserID order by SessionID) as rn
  from @T
)
select *
from cte
where rn = 1

Результат

TransID                        UserID   SessionID                rn
d3YAs6j4L2SxJm95PeDn78NbCq49By f4M5Rmr9 1u0mkd45rt5jz455axcvbgbd 1
Ai36Lft9X4PrHg8p7BTs2n5K5Dcz4E z8CFj92M dzwsyf55s1io1e552ifty555 1
1 голос
/ 22 марта 2011

Сгруппируйте по UserId и решите, какое объединение подходит для остальных столбцов.Я думаю, что это может быть сложно ...

Ваша проблема в том, что отдельный выбор всегда работает для всех столбцов.Таким образом, ваш единственный способ - это группировать, но наличие группы требует, чтобы у вас была функция агрегирования в каждом столбце, который вы хотите отобразить.Вы предоставили гораздо меньше информации о том, что вы хотите получить, если это сработает.

0 голосов
/ 22 марта 2011

Сначала сохраните предстоящий вывод во временной таблице (#TempTrans), затем сделайте следующее:

SELECT DISTINCT UserID FROM #TempTrans
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...