Ответы пользователя по тегу SQL
  • Как подключить к crystal report .sql файл?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    В Репорт Сервисе - внутри самого отчета (RDL файла) хранится запрос (так называемый - "набор данных")
    Скорее всего в Кристал репорте тоже самое

    А на скрине у Вас только ОДБС - это всего лишь подключение к конкретной базе данных
    Ответ написан
    Комментировать
  • Как сделать вывод результатов поиска по совпадениям?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    в MS SQL надо использовать Data Quality Service - в результате запроса будет колонка Similarity (подобие - в процентах) по ней можно и сортировать

    что то подобное должно быть и в других СУБД
    Ответ написан
    Комментировать
  • Как реализовать автоматическую выгрузку данных из 1С?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    Два варианта
    1. прямым запросом в базу
    2. COM соединением
    Ответ написан
    Комментировать
  • Нужен ли индекс или нет?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    2 вариант
    Ответ написан
    Комментировать
  • Какую среду разработки выбрать для написания "аналога 1С", имеющию поддержку работы с SQL серверами?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    Скачайте беслпатно с сайта майкрософт VS, SQL Express
    и вперед :)

    язык выбирайте сами C# или VB
    при выборе языка рекомендую ориентироваться на рынок труда - С# требуются чаще :)
    Ответ написан
    Комментировать
  • Можете посоветовать книжку по проектированию баз данных?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    Сейчас буду ругаться :)

    1) Выбор СУБД, т.е. что в каких случаях выбирать
    Основываясь на своем опыте (22 - проекта) рекомендую так:
    СУБД это всего лишь инструмент
    - Если в организации есть хорошие специалисты которые могут эффективно работать на MS SQL знают все его возможности и понимают почему он так дорого стоит - тогда MS SQL
    - Если в организации есть хорошие специалисты Ораклы - тогда лучше ставить Ораклу
    - Если обрабатываются очень очень секретные данные - тогда тоже лучше что то отличное от MS SQL - например Ораклу (так как операционная система отличная от Виндовс) - но в большинстве компаний данные не представляют интерес для спецслужб :)

    2) Выбор подсистем субд
    - Было бы здорово понять что такое "Подсистема СУБД"

    3) Освещение моментов выбора индексов
    - Все зависит от запросов которые идут в базу, а так же от данных. На начальном этапе индексирования в MS SQL пригодится Помощьник по настройки ядра СУБД. Дальше уже надо исходить из анализа планов запросов (не обязательно всех, а хотя бы самых длительных). При этом надо учитывать что на тестовых данных будут оптимальны одни индексы, а через год эксплуатации имеющиеся индексы уже могут стать не самым лучшим способом поиска по таблицам .... это админить надо базу ...

    4) Может быть какие-нибудь паттерны проектирования
    - В моей компании только и делают что переучивают пришедших специалистов у которых в голове свои патерны! Честное слово - в институте такой Херни на вдалбливают в голову студентов что диву даешься (например: некоторые разработчики в каждой таблице вставляют поле идентети - хотя по нему поиск не производится,и еще на это же поле вешают кластерный индекс - "Мудацкое Российское Высшее Образование"(с))
    - Патерны Хорошо! Замечательно! Но универсальных способов нет!
    Ознакомится с ними стоит что бы не делать ошибок - но даже если сделали такую ошибку - то никто не мешает потом исправить :) разбить таблицу на несколько или объеденить пару таблиц в одну. Главное что бы апликушники (программисты клиентской части) пользовались принципами ООП (что бы сильно не переделывать код программы при изменении структуры базы)
    Ответ написан
    4 комментария
  • Как расположить в несколько столбцов данные из одной строки?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    Комментировать
  • Как правильно сформировать SQL запрос?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    Есть массив слов(с)

    тогда все просто
    сохраните этот массив во временную таблицу
    и сделайте джойн своей таблицы с таблицей массива

    ПС если массив большой - не забудьте для него на временной таблице сделать индекс
    Ответ написан
    Комментировать
  • Как в MS SQL получить имя функции для передачи его в DROP FUNCTION?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    Динамический SQL нужен

    DECLARE @FuncName sysname = (
    SELECT MIN(name)
    FROM sys.objects
    WHERE type_desc LIKE '%FUNCTION%' AND SCHEMA_NAME(schema_id) = 'dbo'
    )

    DECLARE @SQL Varchar(200)
    set @SQL ='DROP FUNCTION ' + @FuncName
    EXECUTE (@sql)

    Примечание:
    Если вдруг выйдет ошибка то можно попробовать
    EXECUTE IMMEDIATE (@sql)
    Ответ написан
    Комментировать
  • Как сделать выборку из всех таблиц одной базы данных в SQL Server?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    SELECT * FROM sys.tables t1
    JOIN sys.columns t2 ON t1.object_id=t2.object_id
    WHERE t2.column_name.xxx ='yyy'
    Ответ написан
    Комментировать
  • Почему использование триггера в mysql/oracle/mssql ... в web-программирование (и не только) считается признаком говнокода?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    потому что:

    - Трудно вносить изменения (изменилась процедура - а триггер на таблице работает по старой логике)
    - Трудно сопровождать (проапдейтил таблицу а сработал набор триггеров и в результате обновления справочника появляются различные документы)
    - логика системы должна быть в одном месте а не распихана по различным уголкам (обновление системы усложняется)
    - Лишние трудности при отладке (правильная работа процедуры или правильное обращение к базе данных вызывает ошибку - потому что триггер может не корректно отработать)
    - и все эти проблемы возводятся в квадрат когда один триггер вызывает срабатывание другого триггера на другой таблице!
    Ответ написан
    Комментировать
  • Удалить все, кроме * sql?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    Сначала проверте что вы будете удалять следующим запросом

    Select  *  from MyTable  where user_id = 21 and delete not like 'not'


    Если в результате запроса именно те строки которые хотите удалить - то удаляйте запросом
    Delete from MyTable  where user_id = 21 and delete not like 'not'
    Ответ написан
    Комментировать
  • Как кэшировать подзапрос в MySQL select?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    Вариант с одним джойном
    (MS SQL - но наверно и в MySql будет что то подобное)

    План запроса будет быстрее чем изначальный вариант только в сочитании с индексом
    CREATE NONCLUSTERED INDEX [NonClusteredIndex-20151120-180424] ON [dbo].[T1]
    (
    [id] ASC,
    [item1] ASC,
    [item2] ASC,
    [item3] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

    -- Создаем таблицы
    CREATE TABLE T1 (id INT IDENTITY(1,1),item1 int,item2 int,item3 INT)
    CREATE TABLE T2 (id INT IDENTITY(1,1),item_id INT, itype VARCHAR(10) )
    
    -- Наполняем данными 
    -- Таблица T1
    INSERT INTO [dbo].[T1] ([item1],[item2],[item3])VALUES(11,12,13)
    INSERT INTO [dbo].[T1] ([item1],[item2],[item3])VALUES(21,22,23)
    INSERT INTO [dbo].[T1] ([item1],[item2],[item3])VALUES(31,32,33)
    INSERT INTO [dbo].[T1] ([item1],[item2],[item3])VALUES(41,42,43)
    INSERT INTO [dbo].[T1] ([item1],[item2],[item3])VALUES(51,52,53)
    INSERT INTO [dbo].[T1] ([item1],[item2],[item3])VALUES(11,32,53)
    INSERT INTO [dbo].[T1] ([item1],[item2],[item3])VALUES(17,32,53)
    
    -- Таблица T2
    INSERT INTO [dbo].[T2]([item_id],[itype]) VALUES(21,'A')
    INSERT INTO [dbo].[T2]([item_id],[itype]) VALUES(11,'B')
    INSERT INTO [dbo].[T2]([item_id],[itype]) VALUES(13,'B')
    INSERT INTO [dbo].[T2]([item_id],[itype]) VALUES(41,'A')
    INSERT INTO [dbo].[T2]([item_id],[itype]) VALUES(42,'A')
    INSERT INTO [dbo].[T2]([item_id],[itype]) VALUES(43,'A')
    INSERT INTO [dbo].[T2]([item_id],[itype]) VALUES(17,'A')
    
    
    -- Исходный запрос
    SELECT * FROM T1 WHERE 
    T1.item1 IN (SELECT item_id FROM T2 WHERE itype='A') AND 
    T1.item2 IN (SELECT item_id FROM T2 WHERE itype='A') AND 
    T1.item3 IN (SELECT item_id FROM T2 WHERE itype='A')
    
    -- Запрос с одним джойном
    ;WITH CTE_OneSubQuery
    AS
    (
    
    SELECT DISTINCT
    tt1.id, tt1.item1,tt1.item2,tt1.item3
    ,CASE (COUNT (tt2.item_id)  OVER (PARTITION BY tt1.id)) WHEN 3 THEN 1 END AS [kol]
    FROM T1 tt1
    JOIN t2 tt2 ON tt2.item_id =CASE
    	WHEN tt2.item_id = tt1.item1 THEN tt1.item1
    	WHEN tt2.item_id = tt1.item2 THEN tt1.item2
    	WHEN tt2.item_id = tt1.item3 THEN tt1.item3
    END 
    
    WHERE  tt2.itype = 'A'
    )
    
    SELECT  id, item1,item2,item3 FROM CTE_OneSubQuery 
    WHERE kol =1
    Ответ написан
  • Как оптимизаровать запрос в postgresql c фильтрацией и сортировкой?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    я бы попробовал следующий вариант

    если возможно то кластерным индексом отсортировать таблицу по - date ASC
    Но надо быть осторожным что бы не затормозить другие запросы (в которых может быть DESC сортировка по дате)
    и создать индекс по полю value

    и почему индекс (value, date) не работает?

    поиск то происходит по полю "value" а не по сочитанию полей
    поле "date" - используется только для сортировки результата, а не отбора --- Поэтому и не работает составной индекс
    Ответ написан
    4 комментария
  • Сколько времени у вас ушло на прохождение курса sql-ex.ru?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    а оно надо ?
    особенно когда идут такие вопросы:
    Какие из нижеперечисленных предикатов имеют истинностное значение TRUE?
    1) 'abc' = 'abc'
    2) 'abc' like 'abc'
    3) 'abc' like 'abc'
    4) 'abc' = 'abc'
    5) 'abc' like 'abc'
    6) 'abc' like 'abc'
    Ответ написан
  • Как Написать запрос sql обновления таблицы данными с другой таблицы?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    В таких случаях рекомендую делать так :)
    Не самое кошерное решение - но зато понятно что происходит и минимум возможности для ошибки :)
    
    --пример таблиц
    CREATE TABLE uzer1 (id INT, name1 NVARCHAR(20))
    CREATE TABLE uzer2 (id INT, name2 NVARCHAR(20))
    
    -- Заполняем данными
    
    -- Таблица [uzer1]
    INSERT INTO [dbo].[uzer1]([id],[name1]) VALUES(1,'Вася')
    INSERT INTO [dbo].[uzer1]([id],[name1]) VALUES(2,'Петя')
    INSERT INTO [dbo].[uzer1]([id],[name1]) VALUES(3,'Гундяев')
    -- Таблица [uzer2]
    INSERT INTO [dbo].[uzer2]([id],[name2]) VALUES(1,'Вася')
    INSERT INTO [dbo].[uzer2]([id],[name2]) VALUES(3,'Кирил')
    
    
    --Шаг 1 
    -- Пишем CTE с джойном двух таблиц - Для проверки что именно у нас на что заменится
    
    ;WITH cte_Update
    as
    (SELECT t1.Name1 AS 'Вот это'
    , t2.Name2 AS 'апдейтим на это'
    FROM [uzer1] t1
    JOIN [uzer2] t2 ON t1.id=t2.id)
    
    --Проверяем что у нас проапдетится именно то что нам надо
    SELECT * FROM cte_Update
    
    --Шаг 2 
    -- пишем все тоже самое только вместо селекта Апдейт
    ;wITH cte_Update
    as
    (SELECT t1.Name1 AS 'Вот это'
    , t2.Name2 AS 'апдейтим на это'
    FROM [uzer1] t1
    JOIN [uzer2] t2 ON t1.id=t2.id)
    
    --Апдейтим
    UPDATE  cte_Update
    SET [Вот это] =[апдейтим на это] 
    
    -- я использую такой способ, мне он кажется более безопасным и быстрым в написании :)
    Ответ написан
  • Как составить sql запрос для выборки статей и комментариев из связанных таблиц?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    ответ на 1 вопрос:
    По теории быстрее второй вариант (тот который у Вас помечен как - "Первый раз я написал так"
    потому что:
    - SELECT * FROM
    так писать не стоит - Звездочка всегда работает медленне чем перечисление колонок, не намного :) но все же
    - просто Left join будет работать быстрее, чем подзапрос - особенно если есть необходимые индексы

    ответ на 2 вопрос:
    "чтобы возвращалось:[данные первой статьи,[первый комментарий, второй, ...]]"(с)
    поддержка такого формата ---> "JSON" реализована в MS SQL 2016

    Ну смотри :)
    Сам напросился :)

    -- Делаем таблички
    CREATE TABLE story( id int ,[text] text,author_id int )
    CREATE TABLE story_comments( id int,s_id INT,[text] text)
    
    -- Заполнем данными
    
    TRUNCATE TABLE [story]
    TRUNCATE TABLE [story_comments]
    
    INSERT INTO [dbo].[story]([id],[text],[author_id])VALUES(1,'Статья 1',1)
    INSERT INTO [dbo].[story]([id],[text],[author_id])VALUES(2,'Статья 2',2)
    
    INSERT INTO [dbo].[story_comments]([id],[s_id],[text])VALUES(1,1,'Первый комент Первой статьи')
    INSERT INTO [dbo].[story_comments]([id],[s_id],[text])VALUES(2,1,'Второй комент Первой статьи')
    INSERT INTO [dbo].[story_comments]([id],[s_id],[text])VALUES(3,1,'Третий комент Первой статьи')
    
    -- Сам запрос
    
    ;WITH cte 
    AS
    ( 
    SELECT [text2]=
    (
    SELECT 
    --s.id     AS 'Story_ID',
           s.[text]  AS 'Story_Text'
    	   ,
         (
    SELECT ISNULL(
    REPLACE( 
    REPLACE(
    REPLACE(
    (SELECT [text]=
    (SELECT sc.[text]AS 'comment_Text'
    FROM [story_comments] sc
    WHERE  s.id=sc.[s_id]
    FOR XML PATH (''))),'</comment_Text><comment_Text>',',')
    ,'<comment_Text>','['),'</comment_Text>',']')
    ,'[NULL]')
    )  
    FROM   [story] s
    FOR XML PATH('')
    ))
    
    SELECT '['+
    REPLACE(
    replace (
    REPLACE (text2,'<Story_Text>','[')
    ,'</Story_Text>[',',[')
    ,'][','],[')+']'
     FROM cte
    
     Ответ:
     [[Статья 1,[Первый комент Первой статьи,Второй комент Первой статьи,Третий комент Первой статьи],[Статья 2,[NULL]]
    Ответ написан
    Комментировать
  • Как правильно составить SQL запрос?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    -- Создали таблицы
    CREATE TABLE counts (count_id INT IDENTITY (1,1) , count_name nVARCHAR(20))
    CREATE TABLE operation  (operation_id INT IDENTITY (1,1) ,operation_count_id INT, balance MONEY,operation_date DATETIME ,operation_name NVARCHAR(50))
    
    go
    -- Очищаем таблицы
    TRUNCATE TABLE counts
    TRUNCATE TABLE operation
    
    -- Заполняем данным
    INSERT INTO [dbo].[counts] ([count_name]) VALUES ('Первый счет')
    INSERT INTO [dbo].[counts] ([count_name]) VALUES ('Второй счет')
    INSERT INTO [dbo].[counts] ([count_name]) VALUES ('Третий счет')
    
    INSERT INTO [dbo].[operation]([operation_count_id],[balance],[operation_date],[operation_name])VALUES(1,'10.3','01-01-2015','Первая операция по первому счету')
    INSERT INTO [dbo].[operation]([operation_count_id],[balance],[operation_date],[operation_name])VALUES(1,'25.5','02-02-2015','Вторая операция по первому счету')
    INSERT INTO [dbo].[operation]([operation_count_id],[balance],[operation_date],[operation_name])VALUES(1,'34.4','03-03-2015','Третья операция по первому счету')
    
    INSERT INTO [dbo].[operation]([operation_count_id],[balance],[operation_date],[operation_name])VALUES(2,'11.7','01-01-2015','Первая операция по Второму счету')
    INSERT INTO [dbo].[operation]([operation_count_id],[balance],[operation_date],[operation_name])VALUES(2,'22.2','04-04-2015','Вторая операция по Второму счету')
    
    INSERT INTO [dbo].[operation]([operation_count_id],[balance],[operation_date],[operation_name])VALUES(3,'33.1','01-01-2015','Первая операция по Тертья счету')
    INSERT INTO [dbo].[operation]([operation_count_id],[balance],[operation_date],[operation_name])VALUES(3,'33.7','02-02-2015','Вторая операция по Третья счету')
    
    
    -- Запрос возвращает баланс последней операции по каждому счету
    SELECT c.count_id,c.count_name
    ,o2.balance
    ,o2.operation_name
     FROM counts c
     JOIN (
    SELECT operation_count_id,
     MAX(operation_date)  AS 'Max Date'
    FROM dbo.operation 
    GROUP BY operation_count_id
    
    ) o ON o.operation_count_id=c.count_id
    JOIN dbo.operation o2 ON o2.operation_count_id=o.operation_count_id AND o2.operation_date=o.[Max Date]
    Ответ написан
    Комментировать
  • Как сравнить значения двух таблиц в Oracle, где нет полей с уникальными значениями и которые могут повторяться?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    -- Создали таблицы
    CREATE TABLE table1 (Numer INT,Data DATETIME , value1 FLOAT,value2 FLOAT)
    CREATE TABLE table2 (Numer INT,Data DATETIME , value1 FLOAT,value2 FLOAT)
    
    go
    -- Очищаем таблицы
    TRUNCATE TABLE table1
    TRUNCATE TABLE table2
    
    -- Заполняем данным
    INSERT INTO dbo.table1 ( Numer, Data, value1, value2 ) VALUES  ( 1, '01.01.2015', 1.1, 1.2  ) -- только в первой таблице
    INSERT INTO dbo.table1 ( Numer, Data, value1, value2 ) VALUES  ( 1, '01.01.2015', 1.2, 1.2  )
    INSERT INTO dbo.table1 ( Numer, Data, value1, value2 ) VALUES  ( 2, '01.01.2014', 2.1, 2.2  )
    INSERT INTO dbo.table1 ( Numer, Data, value1, value2 ) VALUES  ( 5, '01.01.2014', 3.1, 1.2  )
    INSERT INTO dbo.table1 ( Numer, Data, value1, value2 ) VALUES  ( 4, '01.01.2015', 1.1, 4.2  )
    
    -- Заполняем данным
    INSERT INTO dbo.table2 ( Numer, Data, value1, value2 ) VALUES  ( 1, '01.01.2015', 1.2, 1.2  )
    INSERT INTO dbo.table2 ( Numer, Data, value1, value2 ) VALUES  ( 2, '01.01.2014', 2.1, 2.2  )
    INSERT INTO dbo.table2 ( Numer, Data, value1, value2 ) VALUES  ( 3, '01.01.2014', 5.1, 1.2  ) -- Искажение в первом значении
    INSERT INTO dbo.table2 ( Numer, Data, value1, value2 ) VALUES  ( 4, '01.01.2015', 1.1, 4.3  ) -- Искажение в втором значении
    
    go
    SELECT 'Нет совпадения по номеру и дате'
    ,
    * FROM dbo.table1 t1
    FULL JOIN dbo.table2 t2
    ON t2.Data = t1.Data AND t2.Numer = t1.Numer 
    WHERE t2.Numer IS NULL OR t1. Numer IS NULL
    
    UNION ALL
    
    SELECT 'Нет совпадения по первому значению'
    , * FROM dbo.table1 t1
    JOIN dbo.table2 t2
    ON t2.Data = t1.Data AND t2.Numer = t1.Numer 
    AND t2.value2 = t1.value2
    where t2.value1 <> t1.value1
    
    UNION ALL
    
    SELECT 'Нет совпадения по второму значению'
    , * FROM dbo.table1 t1
     JOIN dbo.table2 t2
    ON t2.Data = t1.Data AND t2.Numer = t1.Numer 
    AND t2.value1 = t1.value1
    where t2.value2 <> t1.value2
    Ответ написан
    3 комментария
  • Какие средства проектирования баз данных сейчас в тренде?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    (субъективно)
    VS +TFS
    Ответ написан