我需要一个返回所有行两次的查询。无法使用联合(因为它必须成为索引视图)。
有人知道怎么做吗?
(所以我不能这样做:)
select * from tags
union all
select * from tags
我需要一个返回所有行两次的查询。无法使用联合(因为它必须成为索引视图)。
有人知道怎么做吗?
(所以我不能这样做:)
select * from tags
union all
select * from tags
如果您准备创建另一个表,您可能会侥幸逃脱:
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)
with temp(idx) as (
select 1 as idx union select 2 as idx
)
select * from yourtable cross join temp
select row_number() over (order by columnnamehere), *
from
(
select * from tags
union all
select * From tags
) a
您不能使用联合(或 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
这在一定程度上满足了你的要求,但我仍然觉得这个要求很可疑。除非你能准确解释为什么你认为这应该是一个索引视图。如果答案是“因为它会更快”,那么答案是错误的。
您可以创建一个表来保存要复制的行数,然后对其进行交叉连接:
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