Сделать SQL выбрать одну и ту же строку несколько раз - PullRequest
8 голосов
/ 18 марта 2010

Мне нужно проверить мой почтовый сервер. Как я могу сделать заявление Select который выбирает скажем ID = 5469 тысячу раз.

Ответы [ 11 ]

21 голосов
/ 18 марта 2010

Если я понял ваше значение, то очень простым способом является перекрестное объединение производного запроса в таблице с более чем 1000 строками в ней и добавление к ней топ-1000. Это дублирует ваши результаты 1000 раз.

РЕДАКТИРОВАТЬ: В качестве примера (это MSSQL, я не знаю, сильно ли отличается Access)

SELECT
    MyTable.*
FROM
    MyTable
CROSS JOIN
(
    SELECT TOP 1000
        *
    FROM
        sysobjects
) [BigTable]
WHERE
    MyTable.ID = 1234
6 голосов
/ 18 марта 2010

Вы можете использовать оператор UNION ALL.

Попробуйте что-то вроде:

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

Вам пришлось бы повторять оператор SELECT несколько раз, но вы могли бы написать немного кода VB в Access, чтобы создать динамический оператор SQL, а затем выполнить его. Не красиво, но должно работать.

4 голосов
/ 18 марта 2010

Создать вспомогательную таблицу для этой цели:
JUST_NUMBER(NUM INT primary key)
Вставьте (с помощью некоторого (VB) сценария) числа от 1 до N. Затем выполните этот несоединимый запрос:

SELECT  MYTABLE.*
FROM    MYTABLE,
        JUST_NUMBER
WHERE   MYTABLE.ID = 5469 
    AND JUST_NUMBER.NUM <= 1000
2 голосов
/ 05 мая 2016

легкий путь ...

Это существует только одна строка в БД

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'

Функциональный запрос ... добавление несвязанной таблицы с именем 'dbo.TB_Labels'

SELECT TOP ('times')  Prod_SKU , Prod_Descr , Prod_Price FROM  dbo.TB_Prod,dbo.TB_Labels WHERE Prod_SKU = N'52'
2 голосов
/ 18 марта 2010

Вот способ использования рекурсивного общего табличного выражения для генерации некоторых пустых строк, а затем для перекрестного соединения их обратно с желаемой строкой:

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 вашей реальной таблицей и измените последний предикат, чтобы он соответствовал.

1 голос
/ 14 февраля 2017

В 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"

Конечно, другие БД не обязательно будут иметь такую ​​же функцию, но это можно сделать:

См. здесь .

1 голос
/ 18 марта 2010

Если вы делаете это в SQL Server

declare @cnt int
set @cnt = 0

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

select '12345' может быть любым выражением

0 голосов
/ 06 июня 2018

Повтор строк на основе значения столбца TestTable. Сначала запустите оператор Create table и 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;
0 голосов
/ 13 сентября 2012

создать таблицу # tmp1 (id int, fld varchar (max)) вставить в # tmp1 (id, fld) значения (1, «привет!»), (2, «мир»), (3, «хороший день!»)

выберите * из # tmp1 идти

выберите * из # tmp1, где id = 3 иди 1000

drop table # tmp1

0 голосов
/ 18 марта 2010

Самый простой способ - создать таблицу с 1000 строками. Давайте назовем это BigTable. Затем вы запросите нужные данные и объедините их с большой таблицей, например:

SELECT MyTable.*
FROM MyTable, BigTable
WHERE MyTable.ID = 5469
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...