0

我需要一个返回所有行两次的查询。无法使用联合(因为它必须成为索引视图)。

有人知道怎么做吗?

(所以我不能这样做:)

select * from tags
union all
select * from tags
4

5 回答 5

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)
于 2012-07-25T14:00:01.867 回答
0
with temp(idx) as (
    select 1 as idx union select 2 as idx
)
select * from yourtable cross join temp
于 2012-07-25T13:58:43.287 回答
0
select row_number() over (order by columnnamehere), *
from
(
select * from tags 
union all
select * From tags 
) a
于 2012-07-25T15:11:55.863 回答
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

这在一定程度上满足了你的要求,但我仍然觉得这个要求很可疑。除非你能准确解释为什么你认为这应该是一个索引视图。如果答案是“因为它会更快”,那么答案是错误的。

于 2012-07-25T14:01:49.197 回答
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
于 2012-07-25T14:08:15.537 回答