powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / интересный запрос или что-то еще ?
5 сообщений из 5, страница 1 из 1
интересный запрос или что-то еще ?
    #32028593
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Необходимо определить одинаковы ли значения нескольких полей в нескольких записях таблицы.
Например.
table
id = 1 name1 = 1 name2 = 2 name3 = 3
..
id = 5 name1 = 1 name2 = 3 name3 = 3
..
id = 9 name1 = 2 name2 = 1 name3 = 3
..
..
..
..

Нужно узнать одинаковы ли значения у записей id = 1, id = 5, id = 9 в полях
name1, name2, name3

Как подобное можно реаизовать ?
Заранее благодарен.
С Уважением.

Андрей.
...
Рейтинг: 0 / 0
интересный запрос или что-то еще ?
    #32028601
Tulkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если интересует одна результирующая запись,содержащая признаки равенства между всеми записями,то это что-то вроде:
select (case when sum(name1)=count(*)*max(name1) then 1 else 0 end) as res_name1,
(case when sum(name2)=count(*)*max(name2) then 1 else 0 end) as res_name2,
(case when sum(name3)=count(*)*max(name3) then 1 else 0 end) as res_name3
Правда, будет работать только если поля числовые.
Если это не то, что подразумевалось, то поставьте задачу точнее.
...
Рейтинг: 0 / 0
интересный запрос или что-то еще ?
    #32028602
Tulkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если интересует одна результирующая запись,содержащая признаки равенства между всеми записями,то это что-то вроде:
select (case when sum(name1)=count(*)*max(name1) then 1 else 0 end) as res_name1,
(case when sum(name2)=count(*)*max(name2) then 1 else 0 end) as res_name2,
(case when sum(name3)=count(*)*max(name3) then 1 else 0 end) as res_name3 from...
Правда, будет работать только если поля числовые.
Если это не то, что подразумевалось, то поставьте задачу точнее.
...
Рейтинг: 0 / 0
интересный запрос или что-то еще ?
    #32028605
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посторяюсь уточнить задачу.
Есть таблица из множества записей.
И необходимо узнать у каких записей значения одних и техже полей одинаковы.
Причем какие именно записи нас интересуют известно заранее. Также необходимо знать само значение этого полях в которых значения равны. Поля могут быть как int так и char и bool.

Конечно можно делать очень много запросов из C++ Builder, но это не есть good. Может можно реализовать такое силами и средствами SQL ?

Заранее благодарен.
С Уважением.

Андрей.
...
Рейтинг: 0 / 0
интересный запрос или что-то еще ?
    #32028632
Фотография Александр Степанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Текст хранимой процедуры:
\nCREATE PROCEDURE SameValuesInFields
@TABLE_SCHEMA nvarchar(128 ), --table owner
@TABLE_NAME nvarchar(128 ) --table name
AS

/*
Условимся, что PK определен на одном поле типа int, стоящем на первом месте
*/
create table #tmp_result
(
column_ordinal_position int not null,
column_value sql_variant not null,
PKFromTable int not null
)
DECLARE @PK_NAME nvarchar(128 )
Select
@PK_NAME=COLUMN_NAME
from
INFORMATION_SCHEMA.Columns
where
ORDINAL_POSITION=1 AND
TABLE_NAME=@TABLE_NAME AND
TABLE_SCHEMA=@TABLE_SCHEMA

DECLARE cur CURSOR FOR
Select
COLUMN_NAME,
ORDINAL_POSITION
from
INFORMATION_SCHEMA.Columns
where
TABLE_NAME=@TABLE_NAME
AND TABLE_SCHEMA=@TABLE_SCHEMA
AND ORDINAL_POSITION>1
Order By
Ordinal_Position

DECLARE @SQLText nvarchar(4000), @ORDINAL_POSITION int, @COLUMN_NAME nvarchar(128 )

open cur

fetch next from cur into @COLUMN_NAME, @ORDINAL_POSITION

while @@fetch_status=0
BEGIN
Set @SQLText=
'Select '+CAST(@ORDINAL_POSITION As varchar(10))+' As column_ordinal_position, '+
't1.['+@COLUMN_NAME+'] As column_value, '+
't1.['+@PK_NAME+'] As PKFromTable '+
'From '+
@TABLE_SCHEMA+'.['+@TABLE_NAME+'] t1 '+
'inner join '+@TABLE_SCHEMA+'.['+@TABLE_NAME+'] t2 '+
'on t1.['+@COLUMN_NAME+']=t2.['+@COLUMN_NAME+'] AND '+
't1.['+@PK_NAME+']<>t2.['+@PK_NAME+'] '+
'Group By t1.['+@COLUMN_NAME+'], t1.['+@PK_NAME+'] '+
'HAVING Count(*)>1'
INSERT INTO #tmp_result execute (@SQLText)
fetch next from cur into @COLUMN_NAME, @ORDINAL_POSITION
END

close cur
deallocate cur

Select * from #tmp_result
GO


Пример использования:
\ncreate table tmp
(
pk int identity(1,1) not null primary key clustered,
name1 nvarchar(10) not null,
name2 int not null,
name3 money not null
)
go

insert into tmp (name1, name2, name3) values ('a', 0, 1)
insert into tmp (name1, name2, name3) values ('b', 1, 2)
insert into tmp (name1, name2, name3) values ('c', 0, 1)
insert into tmp (name1, name2, name3) values ('c', 0, 3)
insert into tmp (name1, name2, name3) values ('b', 1, 2)
insert into tmp (name1, name2, name3) values ('c', 1, 5)
insert into tmp (name1, name2, name3) values ('a', 0, 1)
insert into tmp (name1, name2, name3) values ('b', 1, 2)
insert into tmp (name1, name2, name3) values ('b', 1, 2)
insert into tmp (name1, name2, name3) values ('a', 0, 1)
insert into tmp (name1, name2, name3) values ('z', 111111, 111111)
go

execute SameValuesInFields 'dbo','tmp'

drop table tmp
go


Это то, что нужно было получить?
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / интересный запрос или что-то еще ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]