我需要编写一个TSQL程序,它将执行4次选择并将结果连接到一个数据集中。可以这样做吗?
P.S。
选择在循环中执行
修改
这是架构。我不想从属于某些地图的每个单位获得N个最新点数。
Maps
Id
Maps2Units
MapId
UnitId
Units
Id
Points
Id
UnitId
Timestamp
答案 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