Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Упростить расчет...  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

Одним селектом пытаюсь выбрать все простые числа в пределах от 1 до 1000.
Запрос чрезвычайно нечитабельный. Может у кого есть идеи как сделать проще?

select h*100 + d*10 + e + 1 s
from (select 0 e union all select 1 union all select 2 union all select 3
union all select 4 union all select 5 union all select 6 union all select 7
union all select 8 union all select 9) e
cross join (select 0 d union all select 1 union all select 2 union all
select 3 union all select 4 union all select 5 union all select 6 union all
select 7 union all select 8 union all select 9) d
cross join (select 0 h union all select 1 union all select 2 union all
select 3 union all select 4 union all select 5 union all select 6 union all
select 7 union all select 8 union all select 9) h
where not exists(select * from (select 0 e union all select 1 union all
select 2 union all select 3 union all select 4 union all select 5 union all
select 6 union all select 7 union all select 8 union all select 9) e1
                 cross join (select 0 d union all select 1 union all select
2 union all select 3 union all select 4 union all select 5 union all select
6 union all select 7 union all select 8 union all select 9) d1
                 cross join (select 0 h union all select 1 union all select
2 union all select 3 union all select 4 union all select 5 union all select
6 union all select 7 union all select 8 union all select 9) h1
                 where (h.h*100 + d.d*10 + e.e + 1) > (h1.h*100 + d1.d*10 +
e1.e + 2) and (h.h*100 + d.d*10 + e.e + 1) = (h.h*100 + d.d*10 + e.e + 1) /
(h1.h*100 + d1.d*10 + e1.e + 2) * (h1.h*100 + d1.d*10 + e1.e + 2))
order by s


Posted via ActualForum NNTP Server 1.3

30 авг 05, 17:02    [1829737]     Ответить | Цитировать Сообщить модератору
 Re: Упростить расчет...  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
CREATE function dbo.numbers()
returns	@mul table (n tinyint unique)
as begin
	insert @mul 
	select 0 union all
	select 1 union all
	select 2 union all
	select 3 union all
	select 4 union all
	select 5 union all
	select 6 union all
	select 7 union all
	select 8 union all
	select 9 
	return
end
go
select
	a.n + b.n*10 + c.n*100
from dbo.numbers() a
cross join dbo.numbers() b
cross join dbo.numbers() c 
30 авг 05, 17:05    [1829751]     Ответить | Цитировать Сообщить модератору
 Re: Упростить расчет...  [new]
Брюлик
Member

Откуда:
Сообщений: 690
SELECT IDENTITY(INT) "n" INTO Numbers
FROM sysobjects s1
GO
SELECT * FROM Numbers WHERE n%2=1
30 авг 05, 17:05    [1829752]     Ответить | Цитировать Сообщить модератору
 Re: Упростить расчет...  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

В догонку... лучше - то есть читабельнее, план выполнения не очень сильно
беспокоит. Да и еще - таблиц в движке нет ни каких (ни временных, ни
постоянных), базы мастер с ее spt_values тоже нет.


Posted via ActualForum NNTP Server 1.3

30 авг 05, 17:06    [1829754]     Ответить | Цитировать Сообщить модератору
 Re: Упростить расчет...  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

Гавриленко Сергей Алексеевич

Так и мы умеем. Проблема в том, что кроме селекта ничего из операторов не
доступно.
Roman S. Golubin
Одним селектом пытаюсь выбрать



Posted via ActualForum NNTP Server 1.3

30 авг 05, 17:08    [1829767]     Ответить | Цитировать Сообщить модератору
 Re: Упростить расчет...  [new]
Брюлик
Member

Откуда:
Сообщений: 690
Sorry, mistake
30 авг 05, 17:08    [1829774]     Ответить | Цитировать Сообщить модератору
 Re: Упростить расчет...  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
А, сорри ...
Слово-то "простые" я и пропустил.
30 авг 05, 17:10    [1829787]     Ответить | Цитировать Сообщить модератору
 Re: Упростить расчет...  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

DDL нет в принципе - все запрещено... таблиц ни каких в базе нет, даже
системных, и ни чего кроме этой базы недоступно.


Posted via ActualForum NNTP Server 1.3

30 авг 05, 17:10    [1829788]     Ответить | Цитировать Сообщить модератору
 Re: Упростить расчет...  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

Хотя нет - к некоторым стандартным функциям типа coalesce, adddate и т.п.
доступ есть


Posted via ActualForum NNTP Server 1.3

30 авг 05, 17:12    [1829804]     Ответить | Цитировать Сообщить модератору
 Re: Упростить расчет...  [new]
Toking
Member

Откуда: Ковров>>Королев
Сообщений: 234
select q1.v * 100 + q2.v * 10 + q3.v from 
(
select 1 v union all  select 2   union all  select 3   union all  
select 4   union all  select 5   union all  select 6   union all  
select 7   union all  select 8   union all  select 9   union all  select 0) q1
cross join (
select 1 v union all  select 2   union all  select 3   union all  
select 4   union all  select 5   union all  select 6   union all  
select 7   union all  select 8   union all  select 9   union all  select 0) q2 
cross join (
select 1 v union all  select 2   union all  select 3   union all  
select 4   union all  select 5   union all  select 6   union all  
select 7   union all  select 8   union all  select 9   union all  select 0) q3 
cross join (
select 1 v union all  select 2   union all  select 3   union all  
select 4   union all  select 5   union all  select 6   union all  
select 7   union all  select 8   union all  select 9   union all  select 0) q4
cross join (
select 1 v union all  select 2   union all  select 3   union all  
select 4   union all  select 5   union all  select 6   union all  
select 7   union all  select 8   union all  select 9   union all  select 0) q5 
cross join (
select 1 v union all  select 2   union all  select 3   union all  
select 4   union all  select 5   union all  select 6   union all  
select 7   union all  select 8   union all  select 9   union all  select 0) q6 
where 
  (q1.v * 100 + q2.v * 10 + q3.v) != (q4.v * 100 + q5.v * 10 + q6.v) and 
  (q4.v * 100 + q5.v * 10 + q6.v) != 1 and 
  (q4.v * 100 + q5.v * 10 + q6.v) != 0
group by q1.v * 100 + q2.v * 10 + q3.v
having 
  sum(
    case when 
       (q1.v * 100 + q2.v * 10 + q3.v) % (q4.v * 100 + q5.v * 10 + q6.v) = 0 
    then 1 else 0 end
  ) = 0
order by q1.v * 100 + q2.v * 10 + q3.v
30 авг 05, 18:49    [1830371]     Ответить | Цитировать Сообщить модератору
 Re: Упростить расчет...  [new]
Toking
Member

Откуда: Ковров>>Королев
Сообщений: 234
или так, но смысл один

select q1.v * 100 + q2.v * 10 + q3.v  + 1 as S from 
(
select 1 v union all  select 2   union all  select 3   union all  
select 4   union all  select 5   union all  select 6   union all  
select 7   union all  select 8   union all  select 9   union all  select 0) q1
cross join (
select 1 v union all  select 2   union all  select 3   union all  
select 4   union all  select 5   union all  select 6   union all  
select 7   union all  select 8   union all  select 9   union all  select 0) q2 
cross join (
select 1 v union all  select 2   union all  select 3   union all  
select 4   union all  select 5   union all  select 6   union all  
select 7   union all  select 8   union all  select 9   union all  select 0) q3 
cross join (
select 1 v union all  select 2   union all  select 3   union all  
select 4   union all  select 5   union all  select 6   union all  
select 7   union all  select 8   union all  select 9   union all  select 0) q4
cross join (
select 1 v union all  select 2   union all  select 3   union all  
select 4   union all  select 5   union all  select 6   union all  
select 7   union all  select 8   union all  select 9   union all  select 0) q5 
cross join (
select 1 v union all  select 2   union all  select 3   union all  
select 4   union all  select 5   union all  select 6   union all  
select 7   union all  select 8   union all  select 9   union all  select 0) q6 
where 
  (q1.v * 100 + q2.v * 10 + q3.v + 1) != (q4.v * 100 + q5.v * 10 + q6.v + 1) and 
  (q4.v * 100 + q5.v * 10 + q6.v + 1) != 1 and 
  (q4.v * 100 + q5.v * 10 + q6.v + 1) != 0
group by q1.v * 100 + q2.v * 10 + q3.v + 1
having 
  min((q1.v * 100 + q2.v * 10 + q3.v + 1) % (q4.v * 100 + q5.v * 10 + q6.v + 1)) != 0
order by S
30 авг 05, 19:00    [1830400]     Ответить | Цитировать Сообщить модератору
 Re: Упростить расчет...  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

Я вот думаю, что вместо шести объединений от 0 до 9 использовать восемь от 0 до 5, то, вроде, поменьше
текста будет (48 против 60)?

Posted via ActualForum NNTP Server 1.3

30 авг 05, 19:43    [1830504]     Ответить | Цитировать Сообщить модератору
 Re: Упростить расчет...  [new]
Toking
Member

Откуда: Ковров>>Королев
Сообщений: 234
Ха ... тогда уж лучше 14 записей от 0 до 2х. Получится 41 запись против 48 и 60 ... или 20 записей от 0 до 1 :-)

Вот еще вариант:

select q1.v * 100 + q2.v * 10 + q3.v + 1 as S
from (
  select 1 v union all select 2 union all select 3 union all 
  select 4   union all select 5 union all select 6 union all 
  select 7   union all select 8 union all select 9 union all select 0) q1
cross join (
  select 1 v union all select 2 union all select 3 union all 
  select 4   union all select 5 union all select 6 union all 
  select 7   union all select 8 union all select 9 union all select 0) q2
cross join (
  select 1 v union all select 2 union all select 3 union all 
  select 4   union all select 5 union all select 6 union all 
  select 7   union all select 8 union all select 9 union all select 0) q3
where 
  not exists (
    select 1 
    from (
      select 1 v union all select 2 union all select 3 union all 
      select 4   union all select 5 union all select 6 union all 
      select 7   union all select 8 union all select 9 union all select 0) q4
    cross join (
      select 1 v union all select 2 union all select 3 union all 
      select 4   union all select 5 union all select 6 union all 
      select 7   union all select 8 union all select 9 union all select 0) q5
    cross join (
      select 1 v union all select 2 union all select 3 union all 
      select 4   union all select 5 union all select 6 union all 
      select 7   union all select 8 union all select 9 union all select 0) q6 
    where
      ((q1.v * 100 + q2.v * 10 + q3.v + 1) > (q4.v * 100 + q5.v * 10 + q6.v + 2)) and
      (((q1.v * 100 + q2.v * 10 + q3.v + 1) % (q4.v * 100 + q5.v * 10 + q6.v + 2)) = 0)
  )
order by S
31 авг 05, 01:09    [1830921]     Ответить | Цитировать Сообщить модератору
 Re: Упростить расчет...  [new]
Toking
Member

Откуда: Ковров>>Королев
Сообщений: 234
:-( хотя это то, что было в 1м посте, тока отформатированное
31 авг 05, 01:13    [1830927]     Ответить | Цитировать Сообщить модератору
 Re: Упростить расчет...  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

В общем, не пригодилось - сервер http по таймауту отваливается на таких запросах ;-))) Пришлось
изобретать велосипед, но проблема решена.

Posted via ActualForum NNTP Server 1.3

31 авг 05, 02:02    [1830973]     Ответить | Цитировать Сообщить модератору
 Re: Упростить расчет...  [new]
Guest_a
Guest
А не подскажите как?
9 окт 05, 00:41    [1951528]     Ответить | Цитировать Сообщить модератору
 Re: Упростить расчет...  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

Как? Очень просто - проверка на делимость...
select n
from t
where not exists (select *
                          from (select prime= 2 union all select 3 union all select 5 union all select 7 union all select 11 ...)
primes
                          where t.n % prime <> 0)


Posted via ActualForum NNTP Server 1.3

10 окт 05, 10:01    [1952669]     Ответить | Цитировать Сообщить модератору
 Re: Упростить расчет...  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

Точнее
==>n % prime = 0
:-)))


Posted via ActualForum NNTP Server 1.3

10 окт 05, 10:03    [1952679]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить