有一个显示所有结果两次的查询

时间:2012-07-25 13:39:30

标签: sql sql-server

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

有人知道怎么做吗?

(所以我不能这样做:)。

select * from tags
union all
select * from tags

5 个答案:

答案 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