можно объединить таблицу только в одну строку - PullRequest
1 голос
/ 08 августа 2011

У меня есть временная таблица, которую я создаю в sproc, в которой хранится информация о моем пользователе.Мне нужно объединить эту таблицу с другой таблицей, в которой есть НЕСКОЛЬКО строк для этого конкретного пользователя, но я хочу вернуть только один результат из таблицы «многие».

что-то вроде

SELECT u.firstname, u.lastname
FROM #users AS u
INNER JOIN OtherTable AS ot on u.userid = (top 1 ot.userid)

Очевидно, что это не сработает, но это суть того, что я пытаюсь сделать по двум причинам: одна - я хочу, чтобы только одна строка возвращалась (по убыванию поля даты), а другая - для целей оптимизации.Запрос должен отсканировать несколько тысяч строк, как в настоящее время ..

Ответы [ 3 ]

3 голосов
/ 08 августа 2011
SELECT
   u.firstname, u.lastname, t.*
FROM
   #users AS u
   CROSS APPLY
   (SELECT TOP 1 * 
    FROM OtherTable AS ot 
    WHERE u.userid = ot.userid
   ORDER BY something) t
2 голосов
/ 08 августа 2011

Используйте функцию ROW_NUMBER (), чтобы упорядочить строки по дате и времени, а затем отфильтровать по row_num = 1

;WITH otNewest
AS
(
    SELECT * 
    FROM othertable  
    WHERE ROW_NUM() OVER(partition by userid order by datetime DESC) = 1
)
SELECT u.firstname, u.lastname, o.*
FROM #users U
INNER JOIN otNewest O
    ON U.userid = O.userid
0 голосов
/ 08 августа 2011

Итак, если вы присоединяетесь, но не возвращаете какие-либо столбцы из OtherTable, тогда вас интересует только проверка существования?

SELECT u.firstname, u.lastname 
    FROM #users AS u 
    WHERE EXISTS(SELECT 1
                     FROM OtherTable ot
                     WHERE u.userid = ot.userid)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...