![]() |
|
IT и Связь Обсуждение "айтишных" вопросов и средств связи |
![]() |
|
Опции темы
![]() |
Опции просмотра
![]() |
![]() |
#1 |
Заслуженный Участник
|
![]()
Вопрос на засыпку
![]() Есть Таблица с полем наприер Field1 данными: 1,2,3,5,9,10 Задача (тута самое интересное) :D : получить результат: 4,6,7,8 - тоесть то что нету в базе Извращения: 1. выборку зделать по определёным параметрам: тоесть чАво нету между 2 и 5 2. поле может быть разного типа пока вижу ответ только как, создать временную таблицу(со всеми данными) и сравнить эти таблицы. База Данных Пока : MS SQL, Interbase, Access,..... Варианты ![]() |
![]() |
![]() |
Зарегистрируйтесь или войдите под своим именем, чтобы спрятать этот рекламный блок |
![]() |
#2 | |
Редкий собеседник
|
![]() Цитата:
Если тип данных неизвестен (число, строка...) и правило порядка/последовательности может быть описан разными способомами, то есть предложение хранить правильный порядок/последовательность определенного типа данных в отдельной таблице А, ну или написать фунцию/процедуру, которая знает как генерить этот порядок, пусть будет тоже A. С числами видимо все упрощается за счет встроенных средств. И когда надо найти отсутсвующие данные, то сделать выборку из таблицы/функции А in range [a,b] во временную таблицу B (для простоты, тип поля B должен соответствовать типу поля Field1 "рабочей" таблицы) и затем исключить все записи из B, которым соответствуют записям в "рабочей" таблице по значению в поле Field1. Остаток в таблице B и есть ответ. Я думаю тип поля можно найти at runtime. Если нет, то можно написать несколько функций/процедур для разных типов данных, и вызывать нужную при работе с определенной таблицой. Можно написать и функцию-конвертор, но по-идее работа с однотипными данными в базе будет быстрее, чем конвертить каждый раз.
__________________
Steve Jobs:"It's better to be a pirate than to join the Navy." -- Odyssey: Pepsi to Apple |
|
![]() |
![]() |
![]() |
#4 | |
Пенсионер всея Ирландея
|
![]() Цитата:
поле разного типа ...например varchar2 в нем есть "заяц", "волк" и "лиса" ... чего там нет и что там должно быть ? ![]() если серьезно - то какими средствами разработки нужно это определить ?
__________________
невозможно испугать санкциями того, кому похер, так,что санкции против меня на этом форуме, мне феерически похер |
|
![]() |
![]() |
![]() |
#5 |
Просто Зануда
|
![]()
Zindur, SQL - это, по сути, язык для работы с множествами. В твоём примере, если я правильно понимаю, есть некое множество всех возможных чисел и некое подмножество оного, представленное таблицей. Тебе необходимо найти разность полного множества и подмножества, содержащегося в таблице. Если предположить, что всё множество состоит из целых чисел от 1 до 100 включительно, то следующий запрос выдаст искомое:
Код:
SELECT level AS field1 FROM dual CONNECT BY level <= 100 MINUS SELECT field1 FROM t Теперь, если тебе надо найти "чАво нету между 2 и 5", достаточно применить WHERE-clause к вышеприведённой выборке: Код:
SELECT * FROM ( SELECT level AS field1 FROM dual CONNECT BY level <= 100 MINUS SELECT field1 FROM t ) WHERE field1 BETWEEN 2 AND 5 P.S. Вышеприведённый примеры написаны на Oracle SQL. Я не знаю, есть ли в "MS SQL, Interbase, Access,....." иерархические запросы и inline views, но уверен, что то же самое можно выразить используя "родной" синтаксис. |
![]() |
![]() |
![]() |
#6 | |
Спам-робот
|
![]()
Мой вариант - работает везде на ANSI-SQL базах. Пример от 0 до 99 - но расширить дальше легко.Синтаксис - TSQL.
Код:
create table #tmp (int integer) insert into #tmp select 1 union select 2 union select 3 union select 5 union select 9 union select 10 select f.seq from ( Select [09].int + [1090].int*10 as seq from (select 1 as int union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 union select 0) as [09] , (select 1 as int union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 union select 0) as [1090] ) f left join #tmp t on t.int=f.seq where t.int is null and f.seq <11 drop table #tmp Но Zindur, наиболее правильный ответ ты уже выдал сам Цитата:
Только этот вариант даст 100% гарантию что код будет работать в любой ANSI-SQL совместимой базе. Варианты с вычитанием и рекурсией тоже имеют место быть - но ИМХО это не правильно, не дело сервера баз данных заниматься вычитаниями. Да и тормозить будет на больших объемах.
__________________
My Church is Black... |
|
![]() |
![]() |
![]() |
#7 | |
Редкий собеседник
|
![]() Цитата:
__________________
Steve Jobs:"It's better to be a pirate than to join the Navy." -- Odyssey: Pepsi to Apple |
|
![]() |
![]() |
![]() |
#8 |
My name is Exaybachay
|
![]()
в порядке стеба:
Код:
select distinct (select count(1) from tblTable where field > s1.field) * (select count(1) from tblTable) + (select count(1) from tblTable where field > s2.field) from tblTable s1 inner join tblTable s2 on 1 = 1 where (select count(1) from tblTable where field > s1.field) * (select count(1) from tblTable) + (select count(1) from tblTable where field > s2.field) < 1000 and not (select count(1) from tblTable where field > s1.field) * (select count(1) from tblTable) + (select count(1) from tblTable where field > s2.field) in (select field from tblTable)
__________________
митьки никого не хотят победить |
![]() |
![]() |
![]() |
#9 |
Заслуженный Участник
|
![]()
Кароче решился всётаки на так называемую временую тавлицу(ы), производительность всётаки важнее
![]() ![]() Просто вчера меня глючило и всё не как не мог решится (искал чтото замудренное) покушал пивка, прочитал "Жёлтого" - отошло. Да и ни всем клиентам нада ето возможность, (кому надо включитса генератор таблиц - один раз. потерпит один раз пару минут, + с возможностю увеличения - зато потом всё будет красиво и быстренько) Спасиб всем ![]() |
![]() |
![]() |
![]() |
#11 | |
Заслуженный Участник
|
![]() Цитата:
![]() ![]() ![]() |
|
![]() |
![]() |
![]() |
#12 |
Активный Участник
|
![]()
Вот здесь еще посмотреть можно (если, конечно, это то, что нужно):
Detecting gaps and ranges of gaps in incremental number fields http://www.sqlserverfaq.com/controls.../CodeLib/9.htm |
![]() |
![]() |
![]() |
#13 |
My name is Exaybachay
|
![]()
DY, поиск начал и концов гапов - гораздо проще задача по той простой причине, что каждому началу и каждому концу гапа соответствует запись в таблице 1:1.
__________________
митьки никого не хотят победить |
![]() |
![]() |
Зарегистрируйтесь или войдите под своим именем, чтобы спрятать этот рекламный блок |
![]() |
#14 |
Заслуженный Участник
|
![]()
тоже так можно сбацать табличку с ID (1, 2, 3 и т.д.), и каким нибудь calculated field :
Код:
CREATE TABLE [t1] ( [id] [int] IDENTITY (1, 1) NOT NULL , [val] [varchar] (50) NULL , CONSTRAINT [PK_t1] PRIMARY KEY CLUSTERED ( [id] ) ON [PRIMARY] ) ON [PRIMARY] GO WHILE (SELECT COUNT(*) FROM t1)< 10 BEGIN INSERT INTO [dbo].[t1]([val]) VALUES (NULL) CONTINUE END |
![]() |
![]() |
![]() |
#15 | |
Активный Участник
|
![]()
Дык я и не утверждаю, что это и есть решение. Ссылку привел, скорее, как отправную точку.
Цитата:
|
|
![]() |
![]() |