Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

Открыть новую тему     Написать ответ в эту тему

NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
мы тут серваки троллим, а он...
мог бы и подождать пару дней результата  

Так сжалился над кремниевыми рабами - хватит им кристаллы греть, запросы разбирать и в раме их сохранять, да хардами хрустеть

Всего записей: 330 | Зарегистр. 06-05-2003 | Отправлено: 16:20 22-11-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Просматривал структуру базы на предмет последующего ее описания и нашел эпическую по количеству полей таблицу (откуда взялась и кто ее сделал - я хз, но так исторически сложилось). Задался вопросом можно ли из этого монстра отобрать данные из полей, названия полей которых содержат ID (например).
 
P.S. Попробовал перечислять поля с id ы имени руками... чуть пальцы не стер

Всего записей: 330 | Зарегистр. 06-05-2003 | Отправлено: 14:12 29-11-2017
Mic777

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX

Код:
 
select column_name  
  from user_tab_columns  
  where table_name = 'МОЙ_ТАБЛИЦ' /* */
 


Всего записей: 87 | Зарегистр. 15-12-2005 | Отправлено: 15:17 29-11-2017 | Исправлено: Mic777, 15:17 29-11-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
1. Зпустить скрипт формирующий sql-скрипт. Как то так:

Код:
select 'select'
 
union all
 
select column_name + ','  
from user_tab_columns  
where table_name = 'TableName' and column_name like '%ID%'
 
union all
 
select 'from TableName'

2. Убрать из полученного скрипта запятую перед FROM и запустить.

Всего записей: 1455 | Зарегистр. 10-07-2013 | Отправлено: 17:31 29-11-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mic777, так я могу
Вот бы добавить перечень полей в качестве параметров для запроса select fom table where column_name like...
 
Alexzzy, у меня oracle. Так что конструкции "+ ','" и "select 'select'" не взлетят. Вот так взлетает:
select 'select' from dual
union all
select column_name||',' from user_tab_columns  
where table_name = upper('TableName') and column_name like '%ID%'
union all
select 'from TableName' from dual

Всего записей: 330 | Зарегистр. 06-05-2003 | Отправлено: 10:21 30-11-2017
Mic777

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
Может так еще лучше взлетит?

Код:
 
select 'select ' ||
  (select LISTAGG(column_name, ',')  
         within group (order by column_name)
    from user_tab_columns  
   where UPPER(table_name) = 'TABLE_NAME'
     and UPPER(column_name) like '%ID%') ||
  ' from TABLE_NAME t' from dual;
 

 
Правда LISTAGG с 11-ки только вроде.

Всего записей: 87 | Зарегистр. 15-12-2005 | Отправлено: 16:04 30-11-2017
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Результат, возвращаемый LISTAGG ограничен длиной 4000 байт. Если таблица содержит очень много полей с длинными названиями, то длины может не хватить.

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 09:59 01-12-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Что-то тихо стало в ветке... Надо оживить
Есть табличка с логами log4, поля: id (NUMBER(12) not null), createtime (TIMESTAMP(3) default systimestamp(3) not null), text (VARCHAR2(2000)), iddraft (NUMBER(12)).
Ради развлечения себя хочу сделать запрос, который запрашивал бы у пользователя например дату (createtime) и дальше выполнял бы селект с этой датой.
Полистал интернет, набросал такое.
Оракл конечно ругается последними словами.

Всего записей: 330 | Зарегистр. 06-05-2003 | Отправлено: 15:59 20-12-2017 | Исправлено: NiXXX, 16:03 20-12-2017
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ваш запрос может вернуть 0, 1 или много записей. Попытка записать результат выборки, состоящий не из единственной записи, в переменную ROWTYPE, приведёт к ошибке.

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 12:26 21-12-2017 | Исправлено: Dronton2, 12:28 21-12-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
ваш запрос может вернуть 0, 1 или много записей. Попытка записать результат выборки, состоящий не из единственной записи, в переменную ROWTYPE, приведёт к ошибке.

Согласен, количество записей может вернуться разное.
Какой тип переменной съест больше одной строки?

Всего записей: 330 | Зарегистр. 06-05-2003 | Отправлено: 16:01 21-12-2017 | Исправлено: NiXXX, 16:10 21-12-2017
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Тип TABLE OF.
А выборку заменить на SELECT ... BULK COLLECT INTO ... FROM ...
 
Или делать цикл по курсору:

Код:
DECLARE  
  v_timecreate_from DATE := '&Дата_от';  
BEGIN  
  IF v_timecreate_from is not null THEN
    FOR rc IN (select id, createtime, text, iddraft from log4 l4 where l4.createtime >= v_timecreate_from ) LOOP
      -- здесь обрабатываем одну запись, получая значения полей: имя_курсора точка имя_поля.
      -- Например:
      dbms_output.put_line( rc.text );
    END LOOP;
  END IF;  
END;

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 09:39 22-12-2017 | Исправлено: Dronton2, 09:44 22-12-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всех с прошедшими праздниками!
Наступил на очередной грабель. При инсерте ловлю ошибку ORA-02290: check constraint (DR.CHK_CS59) violated. Как понять на что конкретно ругается констрейнт? Проверил все условия - все норм в инсерте...
 
UPDATE!
Вопрос снимается. Админы бухали крепко - криво перенесли констрейнты.

Всего записей: 330 | Зарегистр. 06-05-2003 | Отправлено: 13:45 15-01-2018 | Исправлено: NiXXX, 15:10 15-01-2018
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX, а когда ловили грабель, проверяли что возвращает такой запрос?:
select *
from all_constraints
where owner = 'DR'
and constraint_name = 'CHK_CS59'

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 13:41 16-01-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
NiXXX, а когда ловили грабель, проверяли что возвращает такой запрос?:
select *
from all_constraints
where owner = 'DR'
and constraint_name = 'CHK_CS59'

Нет, додумался туда глянуть
 
Задумался тут над следующим: простой select f1, count(f1) from table where f1 in (1,2,3,4,5) выводит результат типа "f1|кол-во f1". А как вывести ноль напротив значения f1, если его нет в выборке? Например f1=2 нет в таблице, как вывести "2|0"?

Всего записей: 330 | Зарегистр. 06-05-2003 | Отправлено: 12:20 17-01-2018 | Исправлено: NiXXX, 17:55 17-01-2018
Gererro

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
День добрый!
Помогите с запросом, суть такая. Есть база в которую постоянно вносят изменения (в частности Хранимые процедуры, которую надо почистить от лишних храним) и есть эталонная база (с которой надо сравнить). Запрос как раз таки работает с точности да наоборот. Он лишении запросы не возвращает, а возвращает полное сравнение.  
Подскажите в какую степь копать.
USE ms01;
GO
SELECT QUOTENAME( SCHEMA_NAME ( pr1.schema_id ) ) + '.' + QUOTENAME( pr1.name ) as 'Имя процедуры',  
QUOTENAME( SCHEMA_NAME ( pr2.schema_id ) ) + '.' + QUOTENAME( pr2.name ) as 'Имя процедуры'  
from sys.objects pr1
left outer join [MS02].sys.objects pr2  on pr1.name = pr2.name and pr1.schema_id = pr2.schema_id
where pr1.type = 'p'and  pr2.type = 'p'-- and pr2.name is NULL
GO

Всего записей: 11 | Зарегистр. 19-01-2014 | Отправлено: 07:34 18-01-2018
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
А как вывести ноль напротив значения f1, если его нет в выборке? Например f1=2 нет в таблице, как вывести "2|0"?
Нужно найти таблицу, в которой есть все значения в поле f1 (типа справочника). И создать запрос, в котором соединить её с вашей таблицей по полю f1 (соединение должно быть LEFT OUTER или RIGHT OUTER). Если у вас значения f1 должны принимать все целочисленные значения в каком-то диапазоне, то вместо справочника используйте запрос типа:
Код:
SELECT LEVEL n
FROM DUAL
CONNECT BY LEVEL <= 10

 
 
Добавлено:
Gererro, Как я понял, это MS SQL. А эталонная база - ms02. Результаты вашей выборки портит условие "where pr1.type = 'p'and  pr2.type = 'p'".
Оставьте в where только "where pr1.type = 'p'", а "pr2.type = 'p'" добавьте к JOIN.
Код:
USE ms01;  
GO  
SELECT QUOTENAME( SCHEMA_NAME ( pr1.schema_id ) ) + '.' + QUOTENAME( pr1.name ) as 'Имя процедуры',  
    QUOTENAME( SCHEMA_NAME ( pr2.schema_id ) ) + '.' + QUOTENAME( pr2.name ) as 'Имя процедуры'  
FROM sys.objects pr1  
LEFT OUTER JOIN [MS02].sys.objects pr2
    ON pr1.name = pr2.name AND pr1.schema_id = pr2.schema_id AND pr2.type = 'p'
WHERE pr1.type = 'p'
GO

Или используйте оператор MINUS или EXCEPT, вычитая из проверяемой таблицы эталонную

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 11:02 18-01-2018 | Исправлено: Dronton2, 12:35 18-01-2018
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Gererro
Можно просто сделать подзапрос.
select ... from sys.objects pr1 where not exists(select 1 from [MS02].sys.objects pr2...)...

Всего записей: 1455 | Зарегистр. 10-07-2013 | Отправлено: 13:05 18-01-2018 | Исправлено: Alexzzy, 13:06 18-01-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ничего не могу с собой поделать - бесит меня Sybase, но мне от него не спрятаться, не скрыться.
Собственно надо из таблицы отобрать все записи, время создания которых больше 19 часов. Пробовал такую конструкцию: CONVERT(DATE,поле_с_датой,104) = CONVERT(DATE,getdate(),104) and datepart(hour,поле_с_датой) >= 19 - запрос выполняется по-моему вечно, останавливал после 10 минут выполнения. Записей, с временем больше 19 не может быть много - в этом я уверен.
P.S. Adaptive Server Enterprise 15.7 (на всякий случай )

Всего записей: 330 | Зарегистр. 06-05-2003 | Отправлено: 12:28 26-01-2018
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
Какой тип данных у "поле_с_датой" и есть ли по нему индекс?

Всего записей: 1455 | Зарегистр. 10-07-2013 | Отправлено: 13:16 26-01-2018
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alexzzy
Тип datetime.
Такое ощущение, что применение функции к этому полю таблицы препятствует использованию индекса по нему.
Думаю, как из getdate() с помощью бубна и какой-то матери собрать дату с временем 19:00. И с этой конструкцией сравнивать мое поле с датой.

Всего записей: 330 | Зарегистр. 06-05-2003 | Отправлено: 13:20 26-01-2018
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос

Имя:
Пароль:
Сообщение

Для вставки имени, кликните на нем.

Опции сообщенияДобавить свою подпись
Подписаться на получение ответов по e-mail
Добавить тему в личные закладки
Разрешить смайлики?
Запретить коды


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2018

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru