2012-07-25 73 views
0

我需要兩次返回所有行的查詢。 使用聯合是不可能的(因爲它有可能成爲一個索引圖)。有一個顯示所有結果的查詢兩次

任何人都知道該怎麼辦呢?

(所以這個我不能做:)

select * from tags 
union all 
select * from tags 
+1

我最初並未:(不得不刪除索引視圖的要求我的答案,你真的想做什麼?爲什麼強烈需要索引你所有的行兩次? – 2012-07-25 13:49:35

+0

那麼我在基表上加入多個表,所以每個結果都是唯一的。 – user1551787 2012-07-25 13:56:16

+0

但是現在我看到使用聯合可能是唯一可能的方式:(。 – user1551787 2012-07-25 13:56:36

回答

0
with temp(idx) as (
    select 1 as idx union select 2 as idx 
) 
select * from yourtable cross join temp 
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) 
+2

剛要回答這個問題:http://sqlfiddle.com/#!3/9f918/1 – beny23 2012-07-25 14:05:55

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 

這滿足你要求在一定程度上,但我仍然發現需求懷疑。除非你能夠解釋爲什麼你認爲這應該是一個索引視圖。如果答案是「因爲它會更快」,那麼答案是錯誤的。

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 
0
select row_number() over (order by columnnamehere), * 
from 
(
select * from tags 
union all 
select * From tags 
) a