使SQL多次选择同一行

时间:2010-03-18 19:13:01

标签: sql select

我需要测试我的邮件服务器。如何制作Select语句 选择说ID = 5469一千次。

11 个答案:

答案 0 :(得分:21)

如果我理解了你的意思,那么一个非常简单的方法是在一个包含超过1000行的表上的派生查询上交叉连接,并在其上放置前1000。这会将您的结果复制1000次。

编辑:作为一个例子(这是MSSQL,我不知道Access是否有很大的不同)

SELECT
    MyTable.*
FROM
    MyTable
CROSS JOIN
(
    SELECT TOP 1000
        *
    FROM
        sysobjects
) [BigTable]
WHERE
    MyTable.ID = 1234

答案 1 :(得分:6)

您可以使用UNION ALL语句。

尝试类似:

SELECT * FROM tablename WHERE ID = 5469
UNION ALL
SELECT * FROM tablename WHERE ID = 5469

您必须多次重复SELECT语句,但您可以在Access中编写一些VB代码来创建动态SQL语句然后执行它。不漂亮,但它应该工作。

答案 2 :(得分:4)

为此目的创建一个帮助表:
  JUST_NUMBER(NUM INT primary key)
插入(在某些(VB)脚本的帮助下)从1到N的数字。然后执行此未加入的查询:

SELECT  MYTABLE.*
FROM    MYTABLE,
        JUST_NUMBER
WHERE   MYTABLE.ID = 5469 
    AND JUST_NUMBER.NUM <= 1000

答案 3 :(得分:2)

这是一种使用递归公用表表达式生成一些空行,然后将它们交叉连接到所需行的方法:

declare @myData table (val int) ;
insert @myData values (666),(888),(777) --some dummy data

;with cte as
(
    select 100 as a
    union all
    select a-1 from cte where a>0 
        --generate 100 rows, the max recursion depth

)
,someRows as
(
select top 1000 0 a from cte,cte x1,cte x2 
       --xjoin the hundred rows a few times
       --to generate 1030301 rows, then select top n rows
)
select m.* from @myData m,someRows where m.val=666

@myData替换为您的真实表,并更改最终谓词以适应。

答案 4 :(得分:2)

简单方法......

这只存在于DB中的一行

sku = 52 , description = Skullcandy Inkd Green ,price = 50,00

尝试将另一个没有约束键的表与主表相关联

原始查询

SELECT  Prod_SKU , Prod_Descr , Prod_Price FROM  dbo.TB_Prod WHERE Prod_SKU = N'52'

功能查询...添加一个名为&#39; dbo.TB_Labels&#39;

的不相关表格
SELECT TOP ('times')  Prod_SKU , Prod_Descr , Prod_Price FROM  dbo.TB_Prod,dbo.TB_Labels WHERE Prod_SKU = N'52'

答案 5 :(得分:1)

如果你在sql Server中这样做

declare @cnt int
set @cnt = 0

while @cnt < 1000
begin
    select '12345'
    set @cnt = @cnt + 1
end 

select '12345'可以是任何表达式

答案 6 :(得分:1)

在postgres中有一个很好的函数叫做generate_series。所以在 postgreSQL 中它就像:

一样简单
select information from test_table, generate_series(1, 1000) where id = 5469

这样,查询执行1000次。

postgreSQL示例:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; --To be able to use function uuid_generate_v4()

--Create a test table
create table test_table (
   id serial not null,
   uid UUID NOT NULL,
   CONSTRAINT uid_pk PRIMARY KEY(id));

-- Insert 10000 rows
insert into test_table (uid) 
select uuid_generate_v4() from generate_series(1, 10000);

-- Read the data from id=5469 one thousand times
select id, uid, uuid_generate_v4() from test_table, generate_series(1, 1000) where id = 5469;

正如您在下面的结果中看到的那样,来自uid的数据被读取1000次,这是通过在每个新行生成新的uuid来确认的。

 id  |uid                                   |uuid_generate_v4
 ----------------------------------------------------------------------------------------
 5469|"10791df5-ab72-43b6-b0a5-6b128518e5ee"|"5630cd0d-ee47-4d92-9ee3-b373ec04756f"
 5469|"10791df5-ab72-43b6-b0a5-6b128518e5ee"|"ed44b9cb-c57f-4a5b-ac9a-55bd57459c02"
 5469|"10791df5-ab72-43b6-b0a5-6b128518e5ee"|"3428b3e3-3bb2-4e41-b2ca-baa3243024d9"
 5469|"10791df5-ab72-43b6-b0a5-6b128518e5ee"|"7c8faf33-b30c-4bfa-96c8-1313a4f6ce7c"
 5469|"10791df5-ab72-43b6-b0a5-6b128518e5ee"|"b589fd8a-fec2-4971-95e1-283a31443d73"
 5469|"10791df5-ab72-43b6-b0a5-6b128518e5ee"|"8b9ab121-caa4-4015-83f5-0c2911a58640"
 5469|"10791df5-ab72-43b6-b0a5-6b128518e5ee"|"7ef63128-b17c-4188-8056-c99035e16c11"
 5469|"10791df5-ab72-43b6-b0a5-6b128518e5ee"|"5bdc7425-e14c-4c85-a25e-d99b27ae8b9f"
 5469|"10791df5-ab72-43b6-b0a5-6b128518e5ee"|"9bbd260b-8b83-4fa5-9104-6fc3495f68f3"
 5469|"10791df5-ab72-43b6-b0a5-6b128518e5ee"|"c1f759e1-c673-41ef-b009-51fed587353c"
 5469|"10791df5-ab72-43b6-b0a5-6b128518e5ee"|"4a70bf2b-ddf5-4c42-9789-5e48e2aec441"

当然,其他数据库不一定具有相同的功能但可以完成:

请参阅here

答案 7 :(得分:0)

create table#tmp1(id int,fld varchar(max)) 插入#tmp1(id,fld) 值(1,'你好!'),(2,'世界'),(3,'美好的一天!')

从#tmp1中选择* 去

从#tmp1中选择*,其中id = 3 去1000

drop table#tmp1

答案 8 :(得分:0)

根据TestTable的列值重复行。首先运行Create table and insert语句,然后对所需结果运行以下查询。 这可能是另一种解决方案:

CREATE TABLE TestTable
(
 ID INT IDENTITY(1,1),
 Col1 varchar(10),
 Repeats INT
)

INSERT INTO TESTTABLE
VALUES ('A',2), ('B',4),('C',1),('D',0)

WITH x AS 
(
  SELECT TOP (SELECT MAX(Repeats)+1 FROM TestTable) rn = ROW_NUMBER() 
  OVER (ORDER BY [object_id]) 
  FROM sys.all_columns 
  ORDER BY [object_id]
)
SELECT * FROM x
CROSS JOIN TestTable AS d
WHERE x.rn <= d.Repeats 
ORDER BY Col1;

答案 9 :(得分:-1)

简单的方法是创建一个包含1000行的表。我们称之为BigTable。然后,您将查询所需的数据并将其与大表连接,如下所示:

SELECT MyTable.*
FROM MyTable, BigTable
WHERE MyTable.ID = 5469

答案 10 :(得分:-2)

在sql server中尝试:

print 'wow'
go 5

输出:

Beginning execution loop
wow
wow
wow
wow
wow
Batch execution completed 5 times.