TSQL程序,它将执行多个选择并将它们连接成一个结果

时间:2010-02-14 14:05:04

标签: sql-server tsql

我需要编写一个TSQL程序,它将执行4次选择并将结果连接到一个数据集中。可以这样做吗?

P.S。

选择在循环中执行

修改

这是架构。我不想从属于某些地图的每个单位获得N个最新点数。

Maps
   Id

Maps2Units
   MapId
   UnitId

Units
   Id

Points
   Id
   UnitId
   Timestamp

7 个答案:

答案 0 :(得分:2)

而不是选择循环,我首先尝试将其重构为单个选择以撤回所有信息。

除此之外,将所有选择信息转储到临时表(或表变量,取决于性能影响),然后从该表中选择返回所有信息是一个语句。

答案 1 :(得分:2)

编辑:使用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 :(得分:0)

使用临时表

答案 3 :(得分:0)

select col1 from tableA
union
select col2 from tableB
union
select col3 from tableC
union
select col4 from tableD

所选列必须与数据类型匹配

答案 4 :(得分:0)

如果所有4个数据集共享公共值以将它们链接到行,请使用INNER JOIN。

如果所有4个数据集具有相同的列定义,但只检索不同的数据,请使用UNION

编辑 - 根据您更新的问题,听起来像您需要以下内容:http://allenbrowne.com/subquery-01.html#TopN以获得每个组的前N个

答案 5 :(得分:0)

声明一个临时(#)表或一个表变量(@)并选择它。然后在完成后从你的临时选择*。

答案 6 :(得分:0)

根据您提供的信息:

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