Процедура TSQL, которая будет выполнять множественное выделение и объединять их в один результат - PullRequest
0 голосов
/ 14 февраля 2010

Мне нужно написать процедуру TSQL, которая будет выполнять 4 выбора и объединять результаты в одном наборе данных. Можно ли это сделать?

приписка

Выборы выполняются в цикле

EDIT

Вот схема. Я не хочу получать N последних очков от каждого юнита, принадлежащего НЕКОТОРОЙ карте.

Maps
   Id

Maps2Units
   MapId
   UnitId

Units
   Id

Points
   Id
   UnitId
   Timestamp

Ответы [ 7 ]

2 голосов
/ 14 февраля 2010

Редактировать: другое решение с использованием top

SELECT
    *
FROM
    Maps2Units MU
    CROSS APPLY
    (
    SELECT TOP (@n) --or TOP 3 etc
        *
    FROM
        Points P
    WHERE
        P.UnitId = MU.UnitId
    ) P2

Догадываясь от вашего предыдущего комментария ...

;WITH myCTE AS 
(
    SELECT
        *,
        ROW_NUMBER() OVER (PARTITION BY P.UnitId ORDER BY P.Timestamp DESC) AS PointsRank
    FROM
        Points P
        JOIN
        Maps2Units MU ON P.UnitId = MU.UnitId
)
SELECT
    *
FROM
    myCTE
WHERE
    PointsRank <= @M;

Оригинал:

;WITH myCTE AS 
(
    SELECT
        *,
        ROW_NUMBER() OVER (PARTITION BY SpeciesID ORDER BY AnimalID /* ? */) AS AnimalRank,
        DENSE_RANK() OVER (ORDER BY SpeciesID /* ? */) AS SpeciesRank
    FROM
        MyAnimals
)
SELECT
    *
FROM
    myCTE
WHERE
    SpeciesRank <= @M
    AND
    AnimalRank <= @N
2 голосов
/ 14 февраля 2010

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

Кроме этого, выгрузите всю выбранную информацию во временную таблицу (или табличную переменную, в зависимости от влияния на производительность), а затем выберите из этой таблицы, чтобы вернуть всю информацию в виде одного оператора.

0 голосов
/ 14 февраля 2010

Из предоставленной вами информации:

SELECT Id, NULL AS MapID, NULL AS UnitID, NULL AS Timestamp FROM Maps

union all

SELECT NULL AS ID, MapID, UnitID, NULL AS Timestamp FROM Maps2Units

union all

SELECT ID, NULL, NULL, NULL FROM Units

union all 

SELECT id, null AS MapID, UnitID, null AS Timestamp FROM Points
0 голосов
/ 14 февраля 2010

Объявите временную (#) таблицу или табличную переменную (@) и выберите ее. затем просто выберите * из вашего темпа, когда вы закончите.

0 голосов
/ 14 февраля 2010

Если все 4 набора данных имеют общие значения для связывания их в строки, используйте INNER JOIN.

Если все 4 набора данных имеют одинаковые определения столбцов, но просто получают разные данные, используйте UNION

РЕДАКТИРОВАТЬ - в зависимости от вашего обновленного вопроса звучит так, будто вам нужно что-то вроде следующего: http://allenbrowne.com/subquery-01.html#TopN, чтобы получить N лучших в группе

0 голосов
/ 14 февраля 2010
select col1 from tableA
union
select col2 from tableB
union
select col3 from tableC
union
select col4 from tableD

Выбранные столбцы должны соответствовать типу данных

0 голосов
/ 14 февраля 2010

Использовать временную таблицу

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