我需要一个返回所有行两次的查询。 使用联合是不可能的(因为它必须成为索引视图)。
有人知道怎么做吗?
(所以我不能这样做:)。
select * from tags
union all
select * from tags
答案 0 :(得分:2)
如果你准备创建另一个表,你可能会侥幸逃脱:
create table duplicator (id int)
insert into duplicator values (1),(2)
go
create view dups with schemabinding
as
select tags.column1, tags.column2, ... , duplicator.id
from dbo.tags
cross join dbo.duplicator
go
create unique clustered index ix_dups on dups(tags.PK, id)
答案 1 :(得分:0)
with temp(idx) as (
select 1 as idx union select 2 as idx
)
select * from yourtable cross join temp
答案 2 :(得分:0)
您无法使用联合(或CTE或自身的交叉联接等)创建索引视图。但你可以这样做(我对列名和主键做出假设):
CREATE VIEW dbo.TagsView1
WITH SCHEMABINDING
AS
SELECT col1, col2 FROM dbo.tags;
GO
CREATE UNIQUE CLUSTERED INDEX x ON dbo.TagsView(col1);
现在创建一个对其执行联合的视图:
CREATE VIEW dbo.TagsView2
AS
SELECT col1, col2 FROM dbo.TagsView1
UNION ALL
SELECT col1, col2 FROM dbo.TagsView1;
GO
这在某种程度上满足了你的要求,但我仍然觉得这个要求是可疑的。除非你能够解释为什么你认为这应该是一个索引视图。如果答案是“因为它会更快”,那么答案是错误的。
答案 3 :(得分:0)
您可以创建一个表来保存要复制的行数,然后对其进行交叉连接:
DECLARE @tblOrig table (PK int, fruitName varchar(20));
insert @tblOrig values (1, 'Apple');
insert @tblOrig values (2, 'Banana');
insert @tblOrig values (3, 'Pear');
DECLARE @tblDup table (DuplicateNumber int);
insert @tblDup values (1);
insert @tblDup values (2);
select t1.*
from @tblOrig t1
cross join @tblDup
答案 4 :(得分:0)
select row_number() over (order by columnnamehere), *
from
(
select * from tags
union all
select * From tags
) a