我需要兩次返回所有行的查詢。 使用聯合是不可能的(因爲它有可能成爲一個索引圖)。有一個顯示所有結果的查詢兩次
任何人都知道該怎麼辦呢?
(所以這個我不能做:)
select * from tags
union all
select * from tags
我需要兩次返回所有行的查詢。 使用聯合是不可能的(因爲它有可能成爲一個索引圖)。有一個顯示所有結果的查詢兩次
任何人都知道該怎麼辦呢?
(所以這個我不能做:)
select * from tags
union all
select * from tags
with temp(idx) as (
select 1 as idx union select 2 as idx
)
select * from yourtable cross join temp
如果你準備創建另一個表,你可能會與此脫身:
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)
剛要回答這個問題:http://sqlfiddle.com/#!3/9f918/1 – beny23 2012-07-25 14:05:55
你可以用」使用聯合(或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
select row_number() over (order by columnnamehere), *
from
(
select * from tags
union all
select * From tags
) a
我最初並未:(不得不刪除索引視圖的要求我的答案,你真的想做什麼?爲什麼強烈需要索引你所有的行兩次? – 2012-07-25 13:49:35
那麼我在基表上加入多個表,所以每個結果都是唯一的。 – user1551787 2012-07-25 13:56:16
但是現在我看到使用聯合可能是唯一可能的方式:(。 – user1551787 2012-07-25 13:56:36