Ответы пользователя по тегу SQL
  • Подкините хорошую книжку по SQL?

    dude_sam
    @dude_sam
    BI Developer
    Две книги от очень известного автора, с уклоном в стек MS, но он старается всего приводить "стандартный код", если это не фирменная фича:
    Microsoft SQL Server 2012 T-SQL Fundamentals
    T-SQL Querying
    Ответ написан
    Комментировать
  • На сколько плохо использовать '*' в sql запросе?

    dude_sam
    @dude_sam
    BI Developer
    Ничего страшного, смело используйте астерикс. При выполнении двух условий:
    1. Не изменится структура низлежашей таблицы (а она изменится, особенно если это представление)
    2. Не потребуются JOIN-ы (а они потребуются, если это не представление)


    ^_^
    Ответ написан
    Комментировать
  • Как построить sql-запрос с выводом актуальных данных по дням?

    dude_sam
    @dude_sam
    BI Developer
    CREATE TABLE #vals
    ([id] INT PRIMARY KEY IDENTITY(1,1)
    ,[name] NVARCHAR(100)
    ,[val] SMALLINT
    ,[date] DATE
    );
    CREATE NONCLUSTERED INDEX [IX_vals_date] ON #vals([date]);
    
    INSERT INTO #vals([name],[val],[date])
    VALUES (N'Лена', 45, '2015-07-01'),
           (N'Женя', 50, '2015-07-01'),
           (N'Саша', 45, '2015-07-01'),
           (N'Лена', 30, '2015-07-02');
    
    WITH vdo AS
    (
    SELECT v.[id], v.[name], v.[val]
          ,v.[date]
          ,ROW_NUMBER() OVER(PARTITION BY v.[name]
                             ORDER BY v.[date] DESC
                            ) AS [date_order]
    FROM #vals v
    )
    SELECT vdo.[id], vdo.[name], vdo.[val]
    FROM vdo
    WHERE vdo.[date_order] = 1;
    
    DROP TABLE #vals;


    upd: Упс, только заметил тег mysql и я так понимаю там нет поддержки ни cte, ни windowsfunction?
    ну, тогда через подзапрос:

    CREATE UNIQUE INDEX [IX_vals_name_date] ON #vals([name],[date]);
    
    SELECT v.[id], v.[name], v.[val]
    FROM #vals v
    INNER JOIN (
                SELECT v.[name], MAX(v.[date]) AS [date_last]
                FROM #vals v
                GROUP BY v.[name]
               ) vdo 
               ON v.[name] = vdo.[name] AND v.[date] = vdo.[date_last];
    Ответ написан
    Комментировать
  • Транзакция в MS SQL - как осуществить проверку?

    dude_sam
    @dude_sam
    BI Developer
    Что-то я не понял ваших таблиц.
    Принимаю их, как:

    users(id_user, name, cash)
    items(id_item, item, price)
    user_item(id_user,id_item)


    Так же совершено непонятна архитектура вашего приложения, но если вы не хотите её пересматривать, то создайте "костыль" в виде таблицы транзакций:

    transactions([id_tran,id_user,id_item,status)

    Как вариант поля статус
    0 - открыта транзакция
    1 - успешно завершена
    2 - ошибка

    При "покупке" перед открытием транзакции (ваш BEGIN TRAN BUYITEM) проверяйте поле [status] для пользователя и в мягком варианте не проводите следующие операции, а в жестком сбрасывайте самую первую, наказывая пользователя за "хитрость" (но тут надо хорошо поработать над исключениями).

    Кстати, можно будет хранить историю "покупок":

    user_item(id_user,id_item,id_tran)

    А таблицу транзакций упростить до:

    transactions([id_tran,id_user,status)

    DISCLAIMER: Всё что я выше написал плохой тон и лучше изменить архитектуру приложения. :)
    Ответ написан
  • Какие существуют способы динамического формирования условий в WHERE?

    dude_sam
    @dude_sam
    BI Developer
    С java, честно говоря, не знаком, но в sql можно формировать динамический запрос в nvarchar и затем запускать его разными способами, к примеру
    DECLARE @sql_exec NVARCHAR(4000), @EOL CHAR(2)
    SELECT @EOL = CHAR(13) + CHAR(10) 
    SELECT @sql_exec = 'SELECT 1' + @EOL
    -- тут добавить условия
    -- формирования динамического запроса
    --
    SELECT @sql_exec = @sql_exec + 'WHERE 1=1'
    -- тут добавить
    -- формирование условий выборки
    -- 
    -- просмотр сформированного запроса
    PRINT @sql_exec
    -- выполнение:
    EXEC(@sql_exec)
    Ответ написан
  • Где найти учебник по SQL?

    dude_sam
    @dude_sam
    BI Developer
    На ИНТУИТ почитайте пару курсов. Правда они там неявным образом, но тяготеют к ms sql.
    Ответ написан
    Комментировать