我有一个包含以下列的表。
EVAL_ID | GGRP_ID | GOAL_ID
1 1 1
2 2 1
2 2 2
3 1 3
我想用另一个名为GOAL_VERSION的列创建一个视图,其值为1到3.因此,对于不同的GOAL_VERSION数字,上表中的每一行应重复5次。输出应该是这样的。
EVAL_ID | GGRP_ID | GOAL_ID |GOAL_VERSION
1 1 1 1
1 1 1 2
1 1 1 3
1 1 1 4
1 1 1 5
2 2 1 1
2 2 1 2
2 2 1 3
2 2 1 4
2 2 1 5
我该怎么做?帮我。谢谢。
答案 0 :(得分:4)
这是你要找的吗?
DECLARE @tbl TABLE(EVAL_ID INT,GGRP_ID INT,GOAL_ID INT);
INSERT INTO @tbl VALUES
(1,1,1)
,(2,2,1)
,(2,2,2)
,(3,1,3);
SELECT tbl.*
,x.Nr
FROM @tbl AS tbl
CROSS JOIN (VALUES(1),(2),(3),(4),(5)) AS x(Nr)
DECLARE @tbl TABLE(EVAL_ID INT,GGRP_ID INT,GOAL_ID INT);
INSERT INTO @tbl VALUES
(1,1,1)
,(2,2,1)
,(2,2,2)
,(3,1,3);
DECLARE @tblCountOfRep TABLE(CountOfRep INT);
INSERT INTO @tblCountOfRep VALUES(3);
SELECT tbl.*
,y.Nr
FROM @tbl AS tbl
CROSS JOIN (SELECT TOP (SELECT CountOfRep FROM @tblCountOfRep) * FROM(VALUES(1),(2),(3),(4),(5) /*add the max count here*/) AS x(Nr)) AS y
在这种情况下,我更喜欢我的数字表...
答案 1 :(得分:1)
看看CROSS JOIN。如果你创建的表格中有一列你想要的5行,那么就可以通过CROSS JOIN来获得你想要的结果。
答案 2 :(得分:1)
您可以使用CTE
和CROSS APPLY
:
;WITH CTE AS
(
SELECT 1 AS GOAL_VERSION
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5
)
SELECT * FROM <your table>
CROSS APPLY CTE
答案 3 :(得分:0)
使用&#34;使用&#34; (cte)带有用于创建视图的rank子句。
答案 4 :(得分:-1)
如果SQL数据库中有数字表,则可以将表与数字表交叉连接,以获得1到5之间的数字
以下是我的SQL解决方案
select
goals.*,
n.i as GOAL_VERSION
from goals, dbo.NumbersTable(1,5,1) n
以下是评论中建议的带有“交叉加入”的修改版本
select
goals.*,
n.i as GOAL_VERSION
from goals
cross join dbo.NumbersTable(1,5,1) n
你可以意识到,我为SQL numbers table使用了一个SQL表值函数 请使用参考教程中给出的源代码创建该SQL函数 我希望它有所帮助,