Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Помогите написать select

create table rm
(
rm number,
dt1 date,
dt2 date,
constraint rm_pk primary key (dt1,dt2),
constraint rm_uk1 unique dt1,
constraint rm_uk2 unique dt2
)


Содержимое таблицы:
1 01.01.15 01.01.15
2 02.01.15 02.01.15
3 03.01.15 03.01.15
4 04.01.15 04.01.15

Необходимо вывести колонки rm,dt1,dt2 и rm для записи, предшествующей текущей, т.е. с максимальной dt2, которая < dt1 текущей, либо 0, если таковой нет.
Для моего примера:
1 01.01.15 01.01.15 0
2 02.01.15 02.01.15 1
3 03.01.15 03.01.15 2
4 04.01.15 04.01.15 3

Своих вариантов что-то нет пока, sorry.
Подозреваю, что мне нужна какая-то аналитическая функция.
Ответ: Уважаемые коллеги, нужно чтобы
select ... where dt2='02-JAN-15'

Выдавал RM DT1       DT2               RP
-- --------- --------- ----------
 2 02-JAN-15 02-JAN-15          1


Т.е. RP должен быть взят из предыдущей записи, несмотря на то, что она не удовлетворяет условию where dt2='02-JAN-15'.
Можно начать изгаляться с max(dt2) where dt2 < ..., но уж очень громоздко получается.
Вопрос: Ребята помогите написать запрос

Ребята помогите написать запрос

select * from table
where name='&name' or name is null

Должен вернуть значения из таблицы, где name равен вводному параметру или же если не равен то должен вернуть только те значение где name пустой(null).


name vote
-------- ---------
A--------5
B--------6
A--------10
null-----11
null-----15
A------- 20
Ответ:
almswiss
Получилось как-то так:

select t.*
from t
where (t.name_ = :name) or (t.name_ is null and not exists(select t.name_ from t where t.name_ = :name))


select t.name_, coalesce(t.val, tn.val) val 
from dual
left join t on (t.name_ = :name) 
left join t tn on (t.name_ is null and tn.name_ is null)
Вопрос: Помогите написать динамический запрос

Добрый день,

Помогите написать динамический запрос. Описание внутри кода в комментариях. У самого не получился - запутался в кавычках и ISNULL-ах :) Заранее спасибо.

CREATE TABLE TEST_TABLE
(
  VAR_1 INT 
  ,VAR_2 INT 
  ,VAR_3 NVARCHAR(255) 
  ,VAR_4 NVARCHAR(255) 
  ,VAR_5 INT 
  ,VAR_6 INT 
  ,VAR_7 INT 
  ,VAR_8 MONEY 
  ,VAR_9 INT 
  ,VAR_10  NVARCHAR(255) 
  ,VAR_11 INT 
  ,VAR_12 BIT
)

INSERT INTO TEST_TABLE
VALUES (1,1,'1','1',1,1,1,1,1,'1',1,1)

/*ДОПУСТИМ У НАС ЕСТЬ ПЕРЕМЕННЫЕ, КОТОРЫЕ МЫ ХОТИМ В ПЕРВУЮ ОЧЕРЕДЬ ЗА'INSERT'ИТЬ В ТАБЛИЦУ TEST_TABLE*/
DECLARE @VAR_1 INT = NULL
DECLARE @VAR_2 INT = NULL
DECLARE @VAR_3 NVARCHAR(255) = NULL
DECLARE @VAR_4 NVARCHAR(255) = NULL
DECLARE @VAR_5 INT = NULL
DECLARE @VAR_6 INT = NULL
DECLARE @VAR_7 INT = NULL
DECLARE @VAR_8 MONEY = NULL
DECLARE @VAR_9 INT = NULL
DECLARE @VAR_10  NVARCHAR(255) = NULL
DECLARE @VAR_11 INT = NULL
DECLARE @VAR_12 BIT = NULL

/*ЗАДАЧА -  Я ХОЧУ ЗА'INSERT'ИТЬ  В ТАБЛИЦУ TEST_TABLE ЗНАЧЕНИЯ ПЕРЕМЕННЫЙ @VAR_1 - @VAR_12. ЕСЛИ КАКАЯ-ТО ПЕРЕМЕННАЯ РАВНА NULL, ТО ТОГДА ИСПОЛЬЗУЕМ ОДНОИМЕННО ПОЛЕ ИЗ ТАБЛИЦЫ TEST_TABLE
Т.Е. БЕЗ ДИНАМИКИ ЭТО ДОЛЖНО ВЫГЛЯДЕТЬ КАК-ТО ТАК 

INSERT INTO TEST_TABLE(VAR_1)
SELECT
  ISNULL(@VAR_1,VAR_1)
FROM TEST_TABLE
WHERE 1=1
*/

/*ТО ЕСТЬ ЕСЛИ ПЕРЕМЕННАЯ ПУСТАЯ (NULL), ТО ЗНАЧЕНИЕ СТОЛБЦА БУДЕТ РАВНО 1*/
Ответ: makar182,

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

declare @strsql nvarchar(max)
declare @var1 nvarchar(10)
set @var1=''

set @strsql='select isnull('''+@var1+''',0),   ...'

select @strsql
Вопрос: Sqlite3 в c++ как ускорить выборку по ключу или правильно написать select - join

вот так создается таблица:
sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS lib (id INT PRIMARY KEY NOT NULL, lid INT, name CHAR[40], path CHAR[256], info TEXT, sid INT);", NULL, 0, &zerrmsg);

вот селекты: запрос по полю id:
t2 = get_time(0);
       sqlite3_exec(db,"BEGIN;",0,0,&err);
       ........................
        while (numlist != NULL)
        {
            sqlite3_prepare16(db,(WCHAR*) L"SELECT id, lid, name, path, info, sid FROM lib WHERE ID = ?;", -1, &stmt, 0);
            sqlite3_bind_int(stmt,1,numlist->number);
            while (sqlite3_step(stmt) == SQLITE_ROW)
            {
                ...................
            }
            sqlite3_finalize(stmt);
            numlist = numlist->next;
        }
        sqlite3_exec(db,"COMMIT;",0,0,&err);
        t2 = get_time(t2);
        cout << " after scroll: " << t2 << endl;

запрос по lid(library id):
sqlite3_prepare16(db,(WCHAR*) L"SELECT id, lid, name, path, info, sid FROM lib WHERE lid = ?;", -1, &stmt, 0);
            sqlite3_bind_int(stmt,1,lid);
            double t3 = get_time(0);
            while (sqlite3_step(stmt) == SQLITE_ROW)
            {
                t1 = get_time(0);
                ................................
                t1 = get_time(t1);
                cout << " one row: " << t1 << endl;
                t2 = get_time(0);
            }
            t2 = get_time(t2);
            cout << " after scroll: " << t2 << endl;
            t3 = get_time(t3);
            cout << "scroll rows: " << t3 << endl;
        sqlite3_finalize(stmt);

функция get time:
double get_time (double t1)
{
    if (t1 == 0) return clock();
    else return (clock() - t1);
}

первый запрос выдает t2 = 60 на ~1000 записей из 1000000, тобишь 6 милисекунд
второй - t1 = 0-1, t2 = 1500 - 3000 (1,5 - 3 секунды), t3 - от t2 отличается на пару милисекунд

итак: по смыслу программы один фаил (id) принадлежит только к одной категории (lid) и необходимо будет много раз запрашивать список из файлов одной категории, и крайне необходимо чтобы список этот формировался максимально быстро (ну никак не за 1,5 секунды)
внимание вопросы:
1) собсно до меня только сейчас дошло наконец что время второго запроса - это просмотр всей базы, ибо lid не уникальный ключ, это так? и есть ли способ это обойти?
2) если создать таблицу категорий скажем:
CREATE TABLE category (lid PRIMARY KEY NOT NULL, name GHAR[50])

, а в таблице lib установить foreign key, то есть:
CREATE TABLE lib (id INT PRIMARY KEY NOT NULL, lid INT, name CHAR[40], path CHAR[256], info TEXT, sid INT, FOREIGN KEY (lid) REFERENCES category(lid))

, то как правильно написать select результат которого будет подобен результату моего 2-го select-а? то бишь из множества записей с разными значениями lid выдаст те в которых это значение равно конкретному, нужному.
я конечно знаю про join, и пыталась найти такую информацию, но не смогла почерпнуть оттуда решение потому что я блондинка либо авторы пускаются в совсем непонятные простаранные объяснения, либо приводятся примеры где объеденяются две таблицы и т.п.
3) если произвести действия указанные во втором вопросе, насколько это ускорит выборку?

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

насколько я понимаю, при первом вызове sqlite3_step должна сформироваться таблица результатов и по ней уже он переходит на следующую строку при каждом вызове, каждую строчку он обрабатывает меньше чем за микросекунду, однако: между моментами когда цикл последний раз отработал и когда программа вышла из цикла проходит аж от 1,5 секунд.. насколько я понимаю после вызова t2 = get_time(0) у нас происходит следущее: вызывается sqlite3_step, она должна перескочить на следующую строку, следующей строки нет и она выдает НЕ SQLITE_ROW, while завершается.. так что в этом процессе может занимать так много времени?
Ответ: White Owl, Слава индексации) 1-2мсек)) спасибо)
Вопрос: Нужно написать select. Работа с БД на Python

Всем привет. Не могу написать такой запрос select , чтобы он вернул только реакции, в которых product=False. Пыталась по-всякому, выдает разные ошибки, типа Cannot iterate over non-entity object, 'Required' object is not iterable и тд.
Вот сам код, некоторые мои попытки закомментированы, уже не помню все способы)
Python
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
from pony.orm import *
 
db = Database()
 
 
class Molecules(db.Entity):
    id = PrimaryKey(int, auto=True)
    structure_hash = Required(str)
    reactions = Set('ReactStruct')
 
 
class Reactions(db.Entity):
    id = PrimaryKey(int, auto=True)
    molecules = Set('ReactStruct')
 
 
class ReactStruct(db.Entity):
    id = PrimaryKey(int, auto=True)
    molecules = Required(Molecules)
    reactions = Required(Reactions)
    product = Required(bool)
 
 
sql_debug(True)
db.bind("sqlite", ":memory:")
db.generate_mapping(create_tables=True)
 
 
with db_session:
    r1= Reactions()
    r2= Reactions()
    r3= Reactions()
 
    m1 = Molecules(structure_hash = "olo")
    m2 = Molecules(structure_hash = "loh")
    m3 = Molecules(structure_hash = "jcj")
    m4 = Molecules(structure_hash = "yyy")
 
    rs1 = ReactStruct(molecules=m1, reactions=r1, product=False)
    rs2 = ReactStruct(molecules=m2, reactions=r1, product=True)
    rs3 = ReactStruct(molecules=m1, reactions=r2, product=False)
    rs4 = ReactStruct(molecules=m2, reactions=r2, product=True)
    rs5 = ReactStruct(molecules=m3, reactions=r2, product=True)
    rs6 = ReactStruct(molecules=m4, reactions=r3, product=False)
    rs7 = ReactStruct(molecules=m1, reactions=r3, product=True)
 
 
    q1 = Molecules.get(structure_hash='olo')
    q2 = Molecules.get(structure_hash='loh')
    q3 = Molecules.get(structure_hash='jcj')
    q1.reactions.select().show()
    # select(r for r in q1.reactions for product in ReactStruct if product == False)
    # select(r for r in res for rs in q1.reactions.molecules for product in rs.product if product == False)
    # select(r for r in q1.reactions for product in ReactStruct if product == False)
    # select(r for r in q1.reactions for rs in Reactions for product in rs.product if product==False)
    # select(product for product in ReactStruct.product if product == False)
для начала были попытки вытащить реакции только для q1, выдает таблицу
id|molecules |reactions |product
--+------------+------------+-------
1 |Molecules[1]|Reactions[1]|False
3 |Molecules[1]|Reactions[2]|False
7 |Molecules[1]|Reactions[3]|True
Теперь нужен select,который вернет [Reactions[1],Reactions[2]], т.е. там где Product=False. Спасибо за помощь заранее!
Ответ: losty, а исходные таблицы, где хранятся данные можно привести? Так будет проще написать запрос.
Вопрос: Оператор select для защищаемых объектов.

Существует база данных и к ней есть пользователь. У него есть разрешения на столбцы таблицы. Если написать select для всех столбцов, то появляется ошибка: Сообщение 230, уровень 14, состояние 1, строка 1 Запрещено разрешение "SELECT" на столбец и т.д. Как правильно написать запрос, чтобы пропустить столбцы, на которые нет доступа? Работаю с БД недавно, поэтому не ругайте сильно.
Ответ: Zartex,

это как-то сурово, напишите инлайн функции или представления для доступа, пусть они разруливают права. Пропустить Вы не сможете в любом случае, но заполнить мусором - запросто.
Вопрос: Помогите пожалуйста написать SELECT запрос

Всем привет!

Есть набор слов она же фраза, например "Привет мир", мне нужно из базы получить все записи которые содержат слова "Привет" и "мир"

как вариант делаю так

declare
 @SQL nvarchar(max),
 @GoogleStr nvarchar(max) = 'Привет мир'

 -- разделение строки поиска на части
 -- ....
 set @SQL = 'select * from MyTable where f1 like(''%''привет''%'') and f1 like(''%''мир''%'')'
 
 -- запрос 
 exec sp_executesql @SQL


вопрос: как избежать SQL инъекций?

версия сервера: Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64)
Oct 19 2012 13:38:57
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
Ответ: Mandarin,

как говорится "а ларчик то просто открывался", вот что нужно было QUOTENAME
Вопрос: Необходимо написать select к бд

Добрый день, Уважаемые коллеги!
Имеется 2 таблицы:
Код SQL
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
CREATE TABLE [dbo].[debt] (    -- информация о долге (кредите)
 [id] [INT] IDENTITY (1, 1) NOT NULL PRIMARY KEY,
 [parent_id] [INT],            -- ссылка на person
 [name] [VARCHAR] (64),        -- название продукта
 [typ] [INT],                  -- тип продукта (словарь №11)
 [r_portfolio_id] [INT],       -- ссылка на портфель
 [currency] [INT],             -- валюта
 [contract] [VARCHAR] (128),    -- номер договора с банком
 [account] [VARCHAR] (32),     -- лицевой счет должника
 [credit_date] [datetime],     -- дата выдачи кредита
 [total_sum] [money],          -- полный размер кредита
 [debt_sum] [money],           -- cумма необходимая к погашению
 [debt_dt] [datetime],         -- дата расчета остатка
 [debt_exp_dt] [datetime],     -- дата актуальности остатка
 [debt_sum_extra] [money],     -- переплата
 [total_rest] [money],         -- остаток основного долга
 [basic_sum] [money],          -- основной долг
 [exp_basic_sum] [money],      -- просроченный основной долг
 [percent_sum] [money],        -- проценты
 [exp_percent_sum] [money],    -- просроченные проценты
 [penalty_sum] [money],        -- штрафы
 [peni_sum] [money],           -- пени
 [commission_sum] [money],     -- комиссия
 [due_sum] [money],            -- гос. пошлина
 [start_sum] [money],          -- начальная cумма, необходимая к погашению (не изменяется)
 [min_sum] [money],            -- возможная минимальная сумма платежа
 [interest_rate] [FLOAT] (6),  -- процентная ставка по кредиту
 [city_name] [VARCHAR] (32),   -- город выдачи
 [start_date] [datetime],      -- дата выхода на просрочку
 [deadline] [datetime],        -- крайний срок погашения
 [STATUS] [INT],               -- статус (словарь №6)
 [dsc] [VARCHAR] (512),        -- комментарий
 [flag_preventive][INT],       -- флаг "Профилактика"
 [sum_on_bank_account][money], -- суммa остатка на счете заемщика 
 [annuity_pay][money],         -- суммa аннуитетного платежа 
 [fine_sum] [money]       -- единовременный штраф
) ON [PRIMARY]
GO
 
 
CREATE TABLE [dbo].[debt_calc] (    -- платежи и начисления по долгу
 [id] [INT] IDENTITY (1, 1) NOT NULL PRIMARY KEY,
 [parent_id] [INT],            -- ссылка на id долга в debt
 [SUM] [money],                -- размер платежа
 [r_currency_id] [INT],        -- валюта
 [int_sum] [money],            -- размер платежа в рублях
 [dt] [datetime],              -- дата регистрации в БД
 [calc_date] [datetime],       -- дата в банке
 [report_date] [datetime],     -- дата, на которую учитывать платеж в отчетах (необязательная)
 [is_confirmed] [INT],         -- признак подтверждения платежа банком (1 – да, 0 - нет)
 [is_cancel] [INT],            -- признак отмены платежа (1 – да, 0 - нет)
 [r_promise_id] [INT],         -- номер обещания, покрытого платежом
 [commission] [money],         -- размер комиссии
 [r_user_id] [INT],            -- индивидуальная привязка коллектора, который получит комиссию
 [req_change] [INT],           -- признак запроса на изменение индивидуальной привязки платежа
 [typ][INT],                   -- тип платежа (null-досудебный платеж, not null - судебный по словарю № 42)
 [dsc] [VARCHAR] (512),        -- комментарий
 [invoice_flag] [INT],         -- флаг квитанция
 [r_req_user_id][INT],         -- коллектор, на которого имеется заявка на смену индивидуальной привязки платежа
 [r_bank_requisites_id] [INT]  -- ссылка на расчетный счет в таблице bank_requisites
) ON [PRIMARY]
GO
Необходимо составить 3 select:
(С этим я справился)Запрос должен выводить:
1. id долга
2. сумму к погашению
3. Город выдачи
4. Положительную разницу

Запрос должен выводить:
1. ссылку на id долга
2. сумму подтвержденных платежей долга
3. Дату последнего подтвержденного платежа

Запрос должен выводить:
1. id долга
2. сумму к погашению
3. Город выдачи
4. сумму подтвержденных платежей долга
5. Дату последнего подтвержденного платежа

Добавлено через 6 минут
Запрос должен выводить:
1. ссылку на id долга
2. сумму подтвержденных платежей долга
3. Дату последнего подтвержденного платежа

Предполагаю, что должно быть как-то так:
select parent_id,
*насколько я понимаю - тут должен быть отбор с условиями(признак отмены =0, признак подтверждения = 1) и сумма(если id равны суммировать значения) значений*,
*тут найти максимальную дату, условия подтверждение == 1, отмена ==0*
from dbo.debt_calc
Ответ: ну шо же, разомнемся:
Код T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
select
    debt_calc.parent_id
    , SUM( debt_calc.[sum] ) as totalsum
    , MAX( debt_calc.[calc_date] ) as last_calc_date
from debt_calc
where
    debt_calc.is_confirmed = 1
group by debt_calc.parent_id
 
select
    debt.id
    , debt.debt_sum
    , debt.city_name
    , SUM( debt_calc.[sum] ) as totalsum
    , MAX( debt_calc.[calc_date] ) as last_calc_date
from debt
    join debt_calc on debt.id = debt_calc.parent_id
where
    debt_calc.is_confirmed = 1
group by debt.id, debt.debt_sum, debt.city_name
Вопрос: Помогите составить select

есть таблица mynotes с полем "iPath". Значения которого такие:

Microsoft
Microsoft\Windows
Microsoft\Windows\XP
Microsoft\Windows\XP\SP3
Microsoft\Windows\ME

делаю
select * from mynotes where ipath LIKE '%Microsoft\Windows\XP%'

записей 0.

делаю
select * from mynotes where ipath LIKE '%Microsoft\\Windows\\XP%'

выбираются две записи:

Microsoft\Windows\XP
Microsoft\Windows\XP\SP3

как и должно быть.

Строка селекта формируется из Java приложения и имеет примерно такой вид:
List list = session.createQuery("from mynotes where ipath LIKE '%" + mask + "%'").list();

где mask это и есть значение фильтра, т.е. "Microsoft\Windows\XP"

Вопрос: как мне в mask впихнуть заместо одного слеша - двойной, чтобы запрос отработал корректно?
Ответ: Спасибо всем.
Решил вопрос.
Вопрос: Помогите разобраться select, like, concat

Приветствую всех!

есть таблица:

id int(11) NOT NULL AUTO_INCREMENT,
br text DEFAULT NULL


в ней данные:
1 17;21
2 19;12
3 13;9
4 14;18
5 8;26

есть запрос:

SELECT * FROM table1 t
WHERE ';17;' LIKE CONCAT(';',br,';')
OR ';21;' LIKE CONCAT(';',br,';')
OR ';19;' LIKE CONCAT(';',br,';')
OR ';12;' LIKE CONCAT(';',br,';')
OR ';13;' LIKE CONCAT(';',br,';')
OR ';9;' LIKE CONCAT(';',br,';')
OR ';14;' LIKE CONCAT(';',br,';')
OR ';18;' LIKE CONCAT(';',br,';')
OR ';8;' LIKE CONCAT(';',br,';')
OR ';26;' LIKE CONCAT(';',br,';');


почему на выходе ничего?
Ответ: все верно
CONCAT(';',br,';') LIKE '%;17;%'
пора домой %