Это единый баз данных тред. Старый смыло. СЕЛЕКТИМ мусор из помоек, срёмся, какая субд хуже, решаем простые задачки на -T-SQL на собеседованиях, поясняем за правильную табуляцию в запросах, креэйтим колоночные индексы на таблички, в которые идёт инсерт и реализуем прочие хорошие практики разработки БД.
В треде приветствуются все: от студаков с обоссанными лабами до любителей анализа данных и машинного обучения.
Постим свои эс-ку-эли-сиквели-транзакты, хвастаемся понятным и без комментариев читаемым кодом с вложенными запросами, решаем прикладные задачи Тети Вали из бухгалтерии "А сделайте мне программку" на уровне архитекторов. Убеждаем залётных, что в тырпрайзе софт не нужен, а автоматизировать можно всё и на процедурах-триггерах-Икселях.
>>862809 Не норм, а отличная штука, особенно если у тебя крутая многоплатформенная тырпрайз система с огромными объёмами кеша и попытками в офлайн работу. Особенно хороша в связке с многозвенной архитектурой сервера и T-SQL. >>862801 (OP) Триггеры - говно и не удовлетворяют реляционной модели, убивают прозрачность и превращают функциональный ЯП в в мультипарадигменный. Короче не нужны.Я ТАК СКОЗАЛ!
Вообще что-то нечитаемое на картинке, хотя я изучал субд как строить эти отношения в нормальных формах. Понятно, что запрос. Но выбери объекты как объекты из значения как значения? Похоже на абстрактное заклинание-мантра. Обычный программист вообще прехнётся от такого.
Привет, подскажите какие есть варианты для хранения свойств товара в реляционной базе? Погуглив я нашел следующие варианты: 1. EAV 2. Одна общая таблица для всех товаров, значение свойств NULL если оно не определено для данного товара. Наверное свойства должны быть более менее одинаковыми, и категорий 2-3. 3. По таблице на каждую категорию товаров. Для скольких категорий такой способ вообще рационален? 10-20 категорий при условии что они все известны на этапе проектирования?
Какие есть еще способы, решения?
И прокатит ли такой вариант, одна таблица Product для общих свойств всех товаров, такие как цена. А индивидуальные свойства категорий товаров хранить с помощью EAV? Что скажите?
или можно сделать по-простому. Сделать таблицу с 3 колонками: Ссылка На Товар (ид товара); Наименование Характеристики (строка); Значение Характеристики (тоже строка, с сериализованным значением)
В буржевики на странице про EAV свободна секция "Physical representation of EAV data", можно запилить свою репрезентэйшен со ссылкой на свой гитхаб профиль.
>>863907 Да, изобретение 1С. А ещё там рядом с атомарными аттрибутами некоторой сущности может идти составной аттрибут (называется табличная часть). Вот для решения таких задач она и может использоваться, трюк называется "Дополнительные реквизиты и сведения".
>>863895 Способы 2 и 3 подойдут только для сделанного на коленке магазина селфи-палок. Особенно уныло то, что тебе придется при каждом новом свойстве добавлять новые колонки в рсубд, удалять ненужные (или класть на них хуй и создавать ночной кошмар для себя и других макак), а также дописывать в логику эти новые колонки и убирать старые. Очевидный EAV очевиден. Для годных фреймворков уже есть готовые библиотеки, реализующие EAV для произвольных объектов. Если будешь проектировать сам - не забывай, что value могут быть не только числом, строкой или "да"/"нет", а еще и опцией (одиночной или множественной), при проектировании это лучше учесть сразу, и в целом все сделать максимально абстрагированно, запрос должен сводиться к
была задача построить дополнительное граф-ориентированное хранилище для прожекта. архитект, вместо очевидного решения выбрать ГОБД, построил самописный кал на редисе. видит ли кто-нибудь невероятное преимущество этого мува?
Бамп, он же вопрос. Есть необходимость освоить postgres. Вот накатил я ее на свой нотебук. Как я понял, у меня нет никакого конфигфайла вообще? Мне его надо создать ручками и только потом запускать сервак, делать юзера, делать бд а потом уже подрубать ее к своим прости, Господи веб-приложухам?
Привет. Вопрос проектирования: допустим, есть какая-то сущность и справочник к ней. Например, машина и её фирма-производитель.
Есть два стула подхода: 1) Иметь две таблицы, машина и фирма, и хранить в таблице машина отдельным столбиком айдишник фирмы. 2) Иметь три таблицы, машина, фирма и таблица-связка МашинаФирма. Тогда связь между машиной и фирмой хранится в третей таблице (ид машины-ид фирмы).
Вроде как хорошей практикой считается подход №2. Кто-нибудь может пояснить в чём его профиты? И как быть с неудобством добавления новой машины и тем, чтобы вытащить инфу о какой-нибудь машины, надо заджойнить аж 3 таблицы.
>>870068 Many to many это понятно. Но такой подход используется даже в отсутствие такой связи. Поэтому я и попросил пояснить плюсы и минусы каждого подхода. Например, при подходе #1, если мы захотим ввести новый справочник, нам надо будет добавить новую колонку в таблицу, это хуже, чем добавить две таблицы и две связи при подходе #2?
>>870172 использовать нечто при отсутствии на то необходимости никогда не даст никаких плюсов. в случае запиливания м2м связей это: а) необходимость дополнительного соединения таблицы; б) необходимость проверки/учета случая, когда связей оказалось две или более, хотя предполагалась всего одна
Сап. Не могу нагуглить, как правильно сделать на postgresql ф-ию, которая возвращала бы записи из таблицы "лайки" (user_id, to_user_id, value) для первых 10 юзеров. Не спрашивайте нахуя, просто надо.
Эта хуйня ниже возвращает строки в виде "(1,8,1)" , а мне нужны нормальные колонки, как при обычном select-е.
>>870214 Если я сделаю RETURNS SETOF refcursor и RETURN NEXT c; (вместо rec, как было) то на выходе получу такую ебалу: <unnamed portal 14> <unnamed portal 14> ..
>>864526 >Для годных фреймворков уже есть готовые библиотеки, реализующие EAV для произвольных объектов. Какие, например? В php для yii, symfony такие либы есть?
Сап. Есть запрос с подзапросом, в котором 4 столбца - цена, имя продукта, год и месяц(из одного и того же столбца одной таблицы)) В запросе мы получаем в каждом месяце каждого года самый продаваемый товар. НО! выводится только кол-во продаж, без наименования товара. Если в select прописать x.NAME то sql посылает нахуй с ошибкой (Столбец "x.NAME" недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.) Если же добавить в group by тогда в выводе выводятся все товары, проданные за всё время, без сортировки по кол-ву самых проданных. Как можно вывести к данной таблице имя товара?
Сам код - use Northwind SELECT MAX(x.Quantity) AS Quantity, [YEAR], [MONTH] FROM (SELECT SUM(Quantity) AS Quantity, Products.ProductName AS NAME, YEAR(OrderDate) AS [YEAR], MONTH(OrderDate) AS [MONTH] FROM Products join [Order Details] ON Products.ProductID = [Order Details].ProductID join Orders ON [Order Details].OrderID = Orders.OrderID GROUP BY YEAR(OrderDate), MONTH(OrderDate), Products.ProductName)x GROUP BY [YEAR], [MONTH] ORDER BY [YEAR], [MONTH]
>>870215 Я вообще больше по Ораклу, но "SETOF refcursor" - это разве не набор курсоров? А тебе тут надо вернуть лишь один курсор. Вдобавок не проще ли сделать "select * from mytable group by user_id order by user_id limit 10" и вернуть курсор на этот запрос?
>>870262 убрать ProductName из подзапроса убрать внешнюю группировку (которая, нахуя-то, дублирует группировку подзапроса) сделать джойн на продукты основному запросу
>>870265 >>870214 а зачем курсоры? я что-то не понимаю, или: select * from likes l where l.user_id in (select top 10 user_id from user) ?
>>870273 Без внешней группировки запрос не работает, так же жалуется на то, что он не содержится ни в статистической функции, ни в предложении GROUP BY.
>>870294 Можно попробовать в подзапросе добавить колонку max(quantity) over (partition by year, month), а во внешнем запросе проверять x.quantity = max(x.quantity).
>>870273 > а зачем курсоры? я что-то не понимаю, или: > select > from likes l > where l.user_id in (select top 10 user_id from user) ? Вообще да, так лучше, только limit 10, top нет в постгресе.
>>870211 Вообще ф-ия, оказалось, работает. Я ее вызывал через "select func()", поэтому такая хуйня была: > Эта хуйня ниже возвращает строки в виде "(1,8,1)" , а мне нужны нормальные колонки, как при обычном select-е. А надо через select from func()
Но ф-ия работает чуть дольше, чем простой запрос выше, так что нахуй ее, да. Я думал, что с подзапросом будет всяко дольше (у меня на самом деле будет число не 10, а намного больше), а курсоры должны быть дохуя быстрые, т.к. это нативная фича.
>>870308 Так таблица уже создана. Мне просто нужен запрос для вывода. И по сути есть запрос, но в него нужно добавить столбец с наименованием продукта.
>>870541 гм, я не знаю, что говорил препод, но в вышеописанном тобой случае при наличии, в теории, большого количества данных (да и без такового случая) - да. случаи всякие бывают, но при росте продукта подобные переусложнения приводят к проблемам, которые еще попробуй решить без костылей и последствий
Microsoft AccessАнон05/11/16 Суб 23:09:38#61№870570
Задача довольно простая, поэтому кто сможет сделать эту бд заплачу 300р Задача: вы собираетесь купить себе телефон, всего существует две торговые сети (допустим связной и евросеть), у каждой из этих сетей есть по 5 филиалов (соответственно со своими адресами и телефонами) и мы выбираем из 5 фирм (например apple Samsung HTC Nokia Motorola) у фирмы есть несколько моделей (у каждой модели свой несколько цветов: белый и черный) По запросу хотим иметь представление где (вам в каком магазине) можно купить телефон интересующей нас модели (соответственно его основные парматеры цвет, цена)
>>871064 Спасибо за старание, однако это не то что надо было. Нужно получить наименование самого продаваемого товара за каждый месяц каждого года. Например на скриншлоте видно, что в 1996 году 7 месяца самый продаваемый - "Chang" Вот только его и надо вывести за период 1996 года 7 месяца, за 8й месяц 96го года другой товар, и так со всей таблицей( записей там вроде до 98го)
>>871100 Условие - вывести самый продаваемый товар в каждом месяце каждого года. У меня оно по сути выполнено, только запрос выдает мне таблицу с тремя столбцами - Год, месяц, кол-во продаж. Данные верны, т.е как в 96ом году 7 месяце продали товар "Chang" 105 штук, так он и выводит - 1996 года 7 месяца 105 продано. А чего продано - не выводит. Ввожу "Name" в SELECT основного запроса - выдает ошибку.
>>871108 там же http://pastebin.com/mBmPRbbD НО я хуй знает, почему запрос выдаёт несколько максимум 2 записей на один год/месяц. но уже поздно, завтра под кофе, может быть, придумаю получше)
>>871161 Ох, спасибо больше, правда! Работает конечно странно, да, иногда дублирует продукты, иногда просто выводит по несколько самых продаваемых за 1(!) месяц.
В постгресе создал unique constraint на колонку. Он работает как индекс? То есть он будет использоваться при быстрого order by по этой колонке? Или только проверяет уникальность?
>>871161 Мне тут вот такое дали, только почему то здесь столбцы дублируются with cte as (SELECT SUM(Quantity) AS Quantity, YEAR(OrderDate) AS [YEAR], MONTH(OrderDate) AS [MONTH], Products.ProductName AS NAME FROM Products JOIN [ORDER Details] ON Products.ProductID = [ORDER Details].ProductID JOIN Orders ON [ORDER Details].OrderID = Orders.OrderID GROUP BY YEAR(OrderDate), MONTH(OrderDate), Products.ProductName)
select * from cte join( SELECT MAX(Quantity) AS Quantity, [YEAR], [MONTH] FROM cte GROUP BY [YEAR], [MONTH] )x on cte.quantity=x.quantity and cte.year=x.year and cte.month=x.month
with cte as (SELECT SUM(Quantity) AS Quantity, YEAR(OrderDate) AS [YEAR], MONTH(OrderDate) AS [MONTH], Products.ProductName AS NAME FROM Products JOIN [ORDER Details] ON Products.ProductID = [ORDER Details].ProductID JOIN Orders ON [ORDER Details].OrderID = Orders.OrderID GROUP BY YEAR(OrderDate), MONTH(OrderDate), Products.ProductName) SELECT * FROM cte WHERE Quantity= ( SELECT TOP 1 Quantity FROM cte c WHERE c.YEAR=cte.YEAR AND c.MONTH=cte.MONTH ORDER BY Quantity desc)
Выдаст несколько записей, если какие-то товары продавались одинаково.
Вариант 2 - с использованием ранжирования:
;WITH cte AS ( SELECT ROW_NUMBER() OVER (PARTITION BY YEAR(orderdate), MONTH(orderdate) ORDER BY SUM(quantity) desc ) ord, SUM(Quantity) AS Quantity, YEAR(OrderDate) AS [YEAR], MONTH(OrderDate) AS [MONTH], Products.ProductName AS NAME FROM Products JOIN [ORDER Details] ON Products.ProductID = [ORDER Details].ProductID JOIN Orders ON [ORDER Details].OrderID = Orders.OrderID GROUP BY YEAR(OrderDate), MONTH(OrderDate), Products.ProductName) SELECT quantity, year, MONTH, NAME FROM cte WHERE ord=1 ORDER BY year, month
Всегда выдаст одну запись за месяц.
Вот, кинули два варианта, так что уже не надо. Спасибо за то что помогал.
>>871379 Сразу добавлю, что второй вариант сейчас считается труъ, ибо работает гораздо быстрее. К cte, все-таки, стоит прибегать только в самых крайних случаях, когда без них совсем никуда, ибо, а самом деле, тот же вложенный запрос получается. Постгерс, конечно, материализует такие вот запросы, чтобы потом обращаться уже к кешу, но, если ваша субд поддерживает оконные функции, то грех ими не пользоваться. Так что я за 2.
ПОдскажите норм бесплатный или продающийся на торрентах GUI для postgreSQL. pgAdmin3 ващпе расстроил после MSSQL MS. Пробовал Valentina studio, вроде ничё, автокомплит, подсветка, но чё то не открывает sql-файлы и drag'ndrop не работает на sql файлах (только копирование ASCII содержимого). Пробовал heidi SQL. Чуть хуже valentina, ибо нет автокомплита, но лучше слона.
>>872366 Думаю, нужно просто привыкнуть к пгадмину, на самом деле, он удобный. Подсказок, правда, нету, но, мне кажется, это только мотивирует хорошо разбираться в структуре даннных.
Анончики, вырисовывается перспектива устройства на должность стажера-разработчика oracle siebel (будут обучать). Поясните за нее. Мне сказали, что помимо проектирования интерфейса, всяких там джоинов, запросов, там нужно будет кодить на js, а я в нем вообще не шарю. Сильно ли это скажется? Сложно ли тогда будет учиться?
О, такой тред. Как раз хотел спросить. Вот есть у меня джве mysql таблицы. В одной колонка с именами и в другой колонка с именами, плюс ещё одна колонка в первой и дохрена других колонок во второй. И нужно привести вторую таблицу в соответствии с первой: выкинуть те имена, которых нет в первой, добавить из первой тех, кого нет во второй, ну и проверить, чтобы второй столбец из первой таблицы соответствовал второму столбцу из второй. Это всё можно сделать несколькими запросами, я в курсе. Но, может, по фен-шую всё более грамотно решается одним запросом?
Для примера, первая таблица: Имя-Должность, а вторая Имя-Должность-Зарплата-НДС-Ипотека-Кредит-Кладбище. Допустим, в первой мы добавили Иванова, удалили Петрова, а Сидорова повысили с гендиректора до дворника. Нажимаем кнопку "обновить вторую таблицу" и инфа в ней становится актуальна инфе в первой.
>>874012 У тебя тут проблема не в том, что это одним запросом проблематично сделать, а в том, что схема неправильно спроектирована. Если уж тебе и нужна зачем-то вообще первая таблица, то на второй таблице две первых колонки должны быть с FOREIGN KEY на колонки в первой.
>>874012 Сделай функции, которые приводят в соответствие же. И вызывай их по нажатию на кнопку. 1. Те записи, которые уже есть, апдейтим, если были изменения 2. Те записи, что пропали в первой, удаляем 3. Новые записи добавляем.
Что тут трудного-то?
Если мускл умеет в триггеры, то повесь триггер на первую таблицу, который будет все это делать за тебя.
Есть таблица CREATE TABLE Posts ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, Pathlvl1 INT DEFAULT 0, Pathlvl2 INT DEFAULT 0, Pathlvl3 INT DEFAULT 0, Pathlvl4 INT DEFAULT 0 )ENGINE = INNODB ; Mysql Надо чтобы быстро выполнялись запросы "SELECT Pathlvl1,Pathlvl2,Pathlvl3,Pathlvl4 FROM Posts WHERE id = ? SELECT COUNT() from Posts WHERE Pathlvl1 = ? SELECT COUNT() from Posts WHERE Pathlvl1 = ? and Pathlvl2 = ? Какие индексы посоветуете сделать?
>>862801 (OP) О, круто, это я удачно зашёл. Так вот, есть следующая задачка (субд PostGreSQL + расширение PostGis): таблица с координатами полигонов. Нужно для вновь добавляемого в таблицу полигона проверить, пересекается ли он хотя бы с одним из тех, что уже в таблице есть? Как это сделать?
>>875554 Бля ты бы хоть описал как там у тебя полигоны задаются. Таблица полигонов, таблица координат узлов, таблица связей? Или как? Вообще, перебираешь все отрезки существующих и добавляемых полигонов, подставляешь в формулу пересечения отрезков координаты отрезков, получаешь результат, либо пересекаются либо нет.
1) Реально ли восстановить базу по ctl-файлам без создания структуры таблиц с прописыванием длины и типов полей? 2) Есть ли какой-нибудь охуительный инструмент для "реставрации" бд из разных кусков говна уровня: зашел в мастер - указал пак файлов - ждешь готовый велосипед с квадратными колесами? 3) Как быстро генерить таблицы с одинаковым типом полей и длиной? 4) Как более-менее распарсить данные уровня: 345345САШАNULL?
Суть в следующем. Есть много файлов нижеописанной структуры с данными на сотни тысяч строк. Поднял MySql server, прикрутил phpmyadmin и workbench. Есть одна проблема: дохуя таблиц и дохуя столбцов, типы полей которых не прописаны. Если бы была одна таблица, я бы даже не заморачивался: распарсил csv и в полуручном режиме загнал. Но там блять целая база. Я нихуя раньше с таким не сталкивался, поэтому прошу твоего совета, анон, как побыстрее загнать все это дело в мою базу. `LOAD DATA INFILE * INTO TABLE load_delimited_data FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"' ( data1, data2 ) BEGINDATA 11111,AAAAAAAAAA 22222,"A,B,C,D,"`
>>893078 дам тебе подсказку: перед тем, как дропать записи на продакшене, добавь в таблицу колонну is_deleted, апдейтом поставь 1 записям, которые надо стереть и после того, как проверишь, что удалятся именно нужные записи, дропаешь те, у которых is_deleted = 1.
>>862801 (OP) Посоветуйте легкий удобынй эдитор, чтобы наглядно и быстро поселектить чегонибудь. Оракловский громоздкий, датагрип для моих целей тем более излишество.
Сап, помогите с постресом! 1.Мне нужно вывести название производителя, который чаще всего встречается в данной таблице. 2. Есть таблица товаров вида Наименование|тип товара|склад|стоимость Нужно вывести все склады, в которых не встречается заданный тип товаров. Хэлп плез!
Здравствуйте, любители баз данных. Расскажите, кем вы работаете, сколько зарабатываете и все такое прочее. Интересует ДС, конечно. Можно ли сделать разработку БД своей специальностью и при этом жить красиво?
>>895267 серьезные фирмы не экономят на ДБА, но бОльшая часть работодателей пытается впихнуть обязанности администрирования бд на сеньоров (а иногда даже на рядовых макакей) зорплаты можно поинвестигейтить. например, в бывшей шараге запросы на оплат у дба высокого уровня явно превышали аналогичный у девов (дотнет, джява, не говоря про фтонтовиков и ебалу типа пхп). но реальных предложений не видел, конеш
>>895278 А на что может рассчитывать мальчик, чуть больше года пишущий запросики в оракл и всякие хранимые хуевины на PL/SQL. Я свою жопку уже пристроил в новое место, но вот думаю, не дешево ли пристроил. Ну тут еще работа показалась очень интересной в плане опыта и развития скиллов, на текущей я с какого-то момента перестал в интересном для себя направлении развиваться.
>>895308 я тоже, имея пару-тройку лет опыта, постоянно спрашиваю себя, не дешево ли я себя пристроил? и, думаю, это нормально в ситуации, когда з/п является тайной пострашнее, чем документы про инопланетян
>>895373 ну тип об этом не принято говорить как бы. и не каждый тебе ответит, какой у него размер зопэ. тем более тебе никто не ответит, какой средний размер по твоей позиции в шараге/отрасли. максимум, расскажут, что !N валютанейм - это для тебя много! или "нам это подходит"
>>895430 По закону ЗП под nda не попадает никаким боком. Как и условия работы. Под nda может попадать только то, что составляет коммерческую тайну - особенности техпроцесса например, код внутренних инструментов, планы развития. Также могут выкинуть на мороз за разглашение чужой ЗП, но только в том случае, если ты узнал ее по своим должностным обязанностям, т.е. ты бухгалтер и имеешь доступ к отчету по ЗП. В любом другом случае на требования не разглашать ЗП можно смело класть - если ты узнал чужую ЗП не пользуясь доступом к внутренней документации и базам данных, можно смело разглашать. А свою ЗП имеешь право хоть на каждом углу озвучивать.
>>896958 Привет! Тут все какие-то неправильные SQLи обсуждают, рад, что встретил тебя. Расскажи, кем ты работаешь, как давно ты в этом, как вообще жизнь сложилась? Насколько оцениваешь свои навыки, видишь ли перспективы для роста?
>>895633 А если я знаю, где в базе хранится размер начисленной зп и посмотрел селектом, сколько зарабатывает мое начальство, а после пригорел и рассказал друзьям, это считается нарушением законодательства?
зашел в тред за вопросом, но подумал что он слишком прост и сам загуглил, в итоге поделюсь с вами энивей.
В общем вот такая тема есть:
Можно прям в селекте например делать умножение.
Например у меня сейчас в системе появилася коэффициент плавающий, и вместо того что бы дрочить и значения в моей таблице перемножать на этот коэфициент, я могу 10 из 10 сделать вот так:
>>896969 везет, у нас позаботились об таких вещах и зашифровали подобные значения какой-то хуитой, доступ к которым имеют особо привелигированные члены с собственной DLLкой в кармане но зато открытыми остались размеры желаемой зорплаты для кандидатов. так вот я там охуел увидеть, что многие DBA на сеньорские позиции просили не менее 4-4.5К (404 если что). с другой стороны, а разве это много, если ты действительно Senior DBA, а не mysql онли?
>>896967 Я не дба. Просто неиспользование планов выполнения, оконных функций, когда надо, и просто неоптимальные (в понятии можно сделать лучше) запросы оборачиваются их переписыванием на ревью. У нас дба смотрят все pr и без их апрува ничего не мержится, где есть взаимодействие с бд. Поэтому и приходится.
>>897337 оконные функции позволяют тебе использовать один экспрешн в нескольких местах запроса, дабы обойти дублирование кода да и вообще, это просто красиво аналитические функции удобны и прекрасны при построении сложной или не очень статистики. где, например, нужно учитывать предыдущие или последующие результаты, транспонировать матрицу. их (функций) немало знаю про mssql, мош у тебя конкретный вопрос по этому поводу?
>>897408 опсъ, я оконные функции спутал с CTE. окно позволяет сранжировать/сгруппировать некоторые данные в пределах вычисления одного столбца. где, например, нужно сгруппировать и отсортировать часть промежуточного результата и посчитать количество его-то. в общем случае тебе бы пришлось создавать подзапрос. в частном случае у тебя бы ничего не получилось оконные функции считаются после выполнения основной части запроса, но до пагинации с сортировкой
>>897463 востребованность меньше, офк, чем всяких других девелоперов ибо потому, что не каждая фирма выделяет средства/ресурсы на DBA отдел, а частенько спихивают в обязанности бэкэндщиков администрирование баз данных
>>897468 ну смотря, какую цель ты преследуешь. если устроиться, лишь бы взяли, то да. но в любом случае, стОит что-то осваивать параллельно и не загнивать на одной технологии, какова бы она не была
>>897487 Устроиться на большие деньги. 200к через 3-4 года опыта. Хочу. Чем заниматься меня вообще не сильно парит, просто базы данных это то, что мне первым пришлось освоить, и они мне интересны.
>>897505 А гугл говорит, что у вас надо делать так... CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo; Простите, я больше не буду давать ответы по чужим базам данных.
>>897504 Я имею в виду, как сохранить этот результат в схему. Чтобы она там была сохранена в качестве таблицы и я мог производить с ней дальнейшие манипуляции
В какой книжке красиво написано про принципы построения реляционных баз данных? Ну там нормальность всякая и прочие заковыристые термины. Работаю с ораклом, если что, нужно подтянуть теорию.
>>897409 Вот про последнюю часть подробнее. Когда какой кусок SQL-запроса выполняется? Может быть GROUP BY ORDER BY PARTITION BY и ORDER BY в одном запросе? И есть какой-нибудь адекватный источник, описывающий механику запроса?
>>862801 (OP) Может кто с аксесом помочь? Проблемка возникла. Есть одна база данных ресторана. В одной таблице(заказы) есть поля блюдо, клиент, сотрудник, сумма заказа. Блюдо сделано подстановкой из таблицы "меню". Возможно ли вообще сделать так, чтобы один клиент выбирал несколько блюд, и потом сосчитать стоимость всего заказа с одного клиента?
>>898229 >один клиент выбирал несколько блюд Ещё одна таблица, связь "один ко многим", т.е. в первой колонке "id", во второй "id клиента", в третьей "id выбранного им".
Запросы с группировками - в справочное руководство по Аксессу либо к книге "Изучаем SQL", там с примерами.
>>898215 > Когда какой кусок SQL-запроса выполняется где-то была картинка с наглядной иллюстрацией очередности стейтментов, но проёп куда-то. в обчем сначала все, что до SELECT ... . потом в рамках SELECT все оконные функции (с учетом тех результатов, которые уже скомпонованы), далее ORDER BY, далее SKIP OFFSET / LIMIT или чо там еще есть в СУБДах
> GROUP BY ORDER BY PARTITION BY и ORDER BY в одном запросе может, причем вся прелесть оконных функций в том, что агрегатные функции можно использовать без группировки по соответствующим колонкам
>>898456 На самом деле я бы мог делать EXPLAIN примеров, но это не объясняет как писать подобные запросы, лал
> ну если MSDN тебе не подходит, то вот почитай Вторая ссылка то, что нужно. Получается будто оконные функции это супер продвинуто раз мало написано. Странно ведь.
> или этот цикл Наверное, не так выразился, но проблема с пониманием именно работы оконных функций. Конкретнее, чем отличается обычный GROUP BY field заменённый на OVER (PARTITION BY field)? Как устроен оптимизатор? Как влияет на эффективность ORDER BY в запросе, в окне? Вот подбоное. Как выполняется проекция и фильтрация знаю.
> SELECT все оконные функции (с учетом тех результатов, которые уже скомпонованы), далее ORDER BY, далее SKIP OFFSET / LIMIT или чо там еще есть в СУБДах Ну вот есть два ORdER BY. Движок БД выполнит обе сортировки по очереди или одну по состваному ключу? Какому ключу приоритет? Какой сортировке приоритет?
>>899888 > или этот цикл по-моему во второй статье упор на аггрегатные функции, в т.ч. их работа в рамках оконных выражений
> есть два ORdER BY ну-ну, обзавелся бы примером уже если ты имеешь ввиду два - один в общем выражении, второй в оконной функции, то, конечно, они будут выполнены оба независимо если это ORDER BY <field_1>, <field_2>, то, в зависимости от наличия индексов на этих полях. если есть составной и поля указаны в том порядке, что указаны в индексе, то эффективность такой сортировки будет максимальной
>>899938 > по-моему во второй статье упор на аггрегатные функции, в т.ч. их работа в рамках оконных выражений Нет. Агрегатные функции рассматриваются в третьей части. Содержимое этой части уже знаю. Поэтому хотелось бы вот такую табличку как на пикрил. Проблема в том, что нет чёткого понимая работы оконных функций. Вот например открыл для себя ROWS и RANGE, которые как раз объясняют понятие оконности!
> ну-ну, обзавелся бы примером уже Пример ужасно банален. Пусть у нас есть табличку users, в которую сохраняется вся информация об активности пользователя на сайте на заданную дату. [code] CREATE TABLE logs ( id INTEGER PRIMARY KEY, user INTEGER, date DATE, url STRING ); [/code] Не думает сейчас о производительности или вроде того. Хочу сосчитать сколько пользователей из тех, что зашли первого декабря, заходило в каждый последующий день до тридцать первого декабя(возврат пользователей). Кажется, что такая задача решится следующим запросом [code] SELECT u.date, COUNT(DISTINCT u.user) OVER (PARTITION BY u.date) FROM users u JOIN ( SELECT DISTINCT user FROM users WHERE date = '2016-12-01' ) tbl ON u.user = tbl.user WHERE u.date BETWEEN '2016-12-01' AND '2016-12-31' ORDER BY u.date; [/code] Обо что спотыкаюсь я. 1. `u.date` должен быть как в проекции так и в определении окна. Почему? 2. Вот здесь можно перенести ORDER BY в окно? 3. Что в это контексте может считаьт COUNT
Небольшой оффтоп: здесь есть язык какой-нибудь разметки? Что-то вроде Markdown?
>>900971 > `u.date` должен быть как в проекции так и в определении окна. Почему? кто тебе сказал? я не знаю, например
> Вот здесь можно перенести ORDER BY в окно? можно, но результат не изменится
> Что в это контексте может считаьт COUNT так как ты возвращаешь только [date] и count(), то на каждую _идентичную_ строку [date] у тебя будет посчитано количество уникальных пользователей. грубо говоря, если только select date from... вернул бы тебе: 2016-12-01 2016-12-01 2016-12-02 2016-12-02 2016-12-03, то, добавляя count over, ты получаешь, к примеру: 2016-12-01 5 2016-12-01 5 2016-12-02 10 2016-12-02 10 2016-12-03 4
> здесь есть язык какой-нибудь разметки каким-то сторонним скриптом вроде как нормально все форматируется. в с++ тред загляни, там шапка у них в табличках и отступах. как так делать, я хз
> Кажется, что такая задача решится следующим запросом мне кажется очевидно, наверное, что ты эту задачу таким запросом не решишь. по фану щас посижу над запросом, может чего вымучаю
У меня есть например таблица с платежами, упростим её до 4 столбцов, всё остальное шелуха.
id_платежа, id_юзера, сумма, дата.
Как мне заселектить с этой таблицы юзеров, который насовершали платежей НА СУММУ НЕ БОЛЬШЕ Х да еще и в период С Дата_1 по Дата_2 ?
Самостоятельно смог пока только заселектить только платежи, которые меньше Х совершенные в период с такой-то по такой-то, но это нихера не то в итоге, что нужно.
Как в общем мне выдрать только пользователей, которые в сумме насовершали платежей от 0 до 500, за этот период? Ну и потом далее по другим категориям от 501 до 1000 например.
>>901229 Я периодически пытаюсь, даже за sql-ex садился, просто сложности с мускулем возникают не чаще раза в месяц, и то скорее потому что нужно вывалить какие-то голые селекты, а остальное время я тупо пишу трешак вида $this->db->select('*'); $this->db->from('mnogo_hueti'); $this->db->where('type !=', $huita); $this->db->where('id <', $id);
В общем что я пытался донести: на работе много дрочева на рутину, которая не способствует обучению особо, далее если я и сажу учить, то через 2 недели уже забываю считай. Ну и как-то так, спасибо за совет энивей.
>>901238 берешь перед сном или в пути читаешь без задней мысли. даже если не поймешь, то в нужный момент вспомнишь, что что-то эдакое да прочитал когда-то
>>901217 Поддвачну. Википедия оказывается лучше в данном случае из-за концентрации информации, а в статейках и книжка аворы растекаются мыслью, что теряешь концентрацию.
Вот рили. Не видел ни одной книжки по кавайному SQL да и не по кавайному тоже
>>901708 срань, позволяющая работать с базочкой и таблицами как с ООП-объектами, не подмешивая языковые запросы в код, а в некоторых экзотических случаях вообще не завися от конкретной СУБД или ее особенностей
Не могу найти нигде в продаже Томаса Кайта для профессионалов, поэтому обращаюсь к вам. Может завалялся у кого-нибудь в ДС и продадите мне либо подарите? Очень хочу бумажную версию. Или же посоветуйте хороший аналог, который реально купить.
Oracle PL/SQL Каковы преимущества использования %type по сравнению с обычным объявлением переменной? Если я знаю, что в переменной будет храниться только значение из одной таблицы, я всегда должен задавать тайп? А технически для базы это чем-то отличается или смысл в том, что для объявления копируется тип данных их таблицы? Если у меня есть табличный тип, я могу каким-то образом сделать select * into из всей таблицы? Или же только циклом заполнять каждое отдельное значение?
>>902375 Если изменится тип у колонки, не нужно будет переписывать объявление же. Чтобы сделать >select * into из всей таблицы объяви переменную tablename%rowtype.
>>902512 И не подумал, действительно очень удобно! Роутайп я знаю. У меня вопрос был как в табличную переменную, состоящую из роутайпов, записать одним запросом всю таблицу. Ну вот у меня есть type t_type is table of t_table%rowtype, я создаю такую переменную. Как в нее добавить сразу все строки из таблицы? Или никак кроме loop по всем строкам нельзя? Наверно, нельзя(
А правда, что все резервные слова в sql должны писаться капсом? Непривычно пиздец, я год маленькими писал... Сделал автореплейс маленьких на большие в PL/sql девелопере, буду потихоньку привыкать.
Такая тема. Подключаюсь к БД на постгре, и не могу ничего записать в базу. Испльзую Entity, и когда вызываю SaveChanges();, оно срет эксепшн: --- System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update()</StackTrace><ExceptionString>Npgsql.NpgsqlException: нулевое значение в колонке "PK_Kol" нарушает ограничение NOT NULL Severity: ОШИБКА Code: 23502 --- Хотя очевидно, что там не НУЛЛ. Короче, как все это дело соединить, Студию, Entity и PostgreSQL? Я в этом не очень, просто лабу делаю.
Собственно как разруливаются подводные камни с разными типами данных? Под каждый тип использующийся в твоей системе хуячить отдельную таблицу, в которой будет value числовое например, текстовое, дробное и так далее и потом все эти таблицы джойнить?
И как превентить ошибки уровня: у меня в базе оказалось что у юзера с id 1 два элемента name с разными валуе лежат, вот что делать в таких ситуациях?
>>902821 Создал проект, через нугет подключил EntityFramework Npgsql Npgsql.EntityFramework Поставил dotConnect Express for PostgreSQL, подключился к базе. App.config взял отсюда http://rob.conery.io/2014/02/05/using-entity-framework-6-with-postgresqlкак и все выше, пофиксил connectionStrings. Ну и дальше код такой же, как по ссылке, вписал свою табличку и поля. И вот когда идет var pet = new Pet { ID = 1, Name = "Stevie" }; db.Pets.Add(pet); db.SaveChanges(); SaveChanges отсылает какую-то хуйню, там нет первичного ключа, вот такое: INSERT INTO "public"."Street"("Name") VALUES (E'Test eba') RETURNING "PK_Pet" Если вставлять через запрос напрямую, в пгАдмине, все работает.
>>902848 > как разруливаются подводные камни с разными типами данных можно да, использовать отдельные столбцы, но если мы говорим только об уровне БД, то тяжко представить, как потом использовать значения результата запроса. в ооп приложении это все достаточо круто делается также можно использовать строковую колонку, а потом кастировать в нужный тип. но тоже так себе подход
> как превентить ошибки уровня уникальный составной индекс (userid, name)
>>902848 >Посоны я прочитал про очки, надел их и теперь ничего не вижу. Что делать? Снять их. EAV это костыль для динамического количества столбцов. Ты пытаешься построить своё приложение вокруг этого костыля. Это просто глупость. В твоём случае (с пользователем) это просто не нужно.
>как разруливаются подводные камни с разными типами данных? Никак. Отдельная таблица на каждый тип - это ещё один костыль для костыля.
Как же тогда хранить сущности с различными и разнотиповыми полями? Использовать БД преднозначенные для этого: та же монга или solr|elasticsearch если нужен ещё и полнотекстовый поиск|фасеты.
Но ваши NoSQL базки не могут в транзакции/джойны. Что делать? Использовать костыль EAV.
Здравствуйте. Смогу ли я из разработки на (PL/)sql перекатиться в администрирование баз данных? И стоит ли вообще? Мне почему-то кажется, что это будет интереснее для меня. Больше ответственность, больше сфера деятельности. Я почитал Томаса Кайта и мне стало очень интересно. Хочется досконально изучить структуру бд. Что вы мне скажете на это? И как вообще в карьерном плане это будет? Кому платят больше, кого больше ценят?
Ребята, как замутить разницу в зп текущего и предыдущего сотрудника? Я так понимаю, это должно делаться через аналитческую функцию типа SUM(), только мне нужна разница.
>>903992 sum какое отношение имеет к разнице? в mssql 2012 и далее есть аналитические функции lead() и lag() более общее решение в лоб - замутить выборку, сджойнить ее на саму себя со смещением в 1 строку и считать разницу столбцов которые is not null скорее всего можно применить оконные функции, но пока непонятно, исходя из задания, как
>>904481 Тебе нужно where не по price а по model. Что-то типа Where model in (select model from printer order by price asc limit 1) Ну или с подзапросом.
>>905422 у тебя тут много подзапросов и они не очень полезные, мягко говоря. тебе нужно, по всей видимости, заюзать функцию ранжирования
как ты проходишь эти тесты? у меня что ни ответ, то сходится на тестовой БД, но валится на проверочной. причем я даже в малейшем отношении хз, что именно не так с запросом
>>905467 >причем я даже в малейшем отношении хз, что именно не так с запросом Я обычно начинаю в пейнте рисовать результат каждой строчки. Конечно лучше в уме такое делать, но пока не получается.
>>905782 ну а как это мне поможет? я стянул дамп основной базы данных и добавил, по мере своей догадки и фантазии еще данных. это похоже на попытку угадать, чем был обдолбан автор. еще в факе там написано что спустя некоторое (какое-то) время появляется подсказка к заданию. вкладка была открыта около часов двух, активность я на ней проявлял порядка 20-30 минут в сумме. сколько ж дожидаться нужно лол?)
Смотрите какая хуйня. Пикрелейтед 4 таблицы из которых я хочу получить данные в результате запроса. Запрос нихуя не работает, хотя и ошибок не выдает. А еще раньше он работал, а вчера внезапно перестал. ЧЯДНТ?
>>862801 (OP) Доброго всем дня. Посоветуйте какую-либо литературу по БД и Microsoft SQL, начиная с нуля. Желательно на русском, но если есть более годные аналоги на английском, посоветуйте их. Спасибо
Новую таблицу из двухАноним08/01/17 Вск 18:15:37#235№908313
Добрый день. Подскажите пожалуйста, в какую сторону смотреть чтобы решить такую проблему. Смотрим картинку и видим Первый и Третий столбец. Они не связаны друг с другом. Т.е видно что выбран 201601 в первом , но при этом в третьем столбце вылезли дни 201602.
Как установить соответствие между полями? чтобы 201601 -> выбирал все дни января.
>>900973 Всем кто советует mysql бей в щщи с вертушки. Мускуль это сетевой табличный движок для порносайтов. Серьезные базы это ORACLE, MS-SQL, PostgreSQL. Я бы учил постгрес потому что оракл отовсюду выкидывают (дораха!) а мс используется гораздо реже.
вечер в хату пацаны и пацанки (если есть такие здесь). есть вариант вкатиться в IT с нуля. от меня требуется изучить ORACLE JavaScript Extension Toolkit (JET). ВОПРОС: эта хуита будет востребована в будущем? или ну его нахуй? вопрос задал здесь, а не в JS треде, потому что решил, что Вам всем это ближе. там они наверное больше по сайтам угарают. а эта шляпа про энтерпрайз (я так понимаю вот это вот всё)
>>909490 Если я так сделаю, то просто вставятся Бисмарк и Теннесси в первую таблицу, причем Теннесси будет две строчки с значениями 2, 1. А нужно, чтобы значение Num_ships именно сложилось.
>>862801 (OP) Посоны, нужна помощь. Есть база данных postgres. Есть простой скрипт для вставки данных
WITH t1 AS ( ... ) INSERT INTO entryphone SELECT FROM t1 --ON CONFLICT ON CONSTRAINT pk_addr_dt_cd DO UPDATE SET code = ephone;
Работает без закомментированной части, а если раскомментить, то выдаёт ошибку: >ОШИБКА: столбец "ephone" не существует > Подсказка: Столбец "ephone" есть в таблице "SELECT*", но на него нельзя ссылаться из этой части запроса.
Но мне нужно, чтобы вставка осуществлялась с проверкой ограничения и в случае нарушения уникальности колонка ephone обновлялась. Как пофиксить?
>>910422 Блядь, забыл про разметку макабы. Поправляю.
WITH t1 AS ( ... ) INSERT INTO entryphone SELECT id, addr, ephone FROM t1 --ON CONFLICT ON CONSTRAINT pk_addr_dt_cd DO UPDATE SET code = ephone;
Работает без закомментированной части, а если раскомментить, то выдаёт ошибку: >ОШИБКА: столбец "ephone" не существует > Подсказка: Столбец "ephone" есть в таблице "SELECT", но на него нельзя ссылаться из этой части запроса.
Но мне нужно, чтобы вставка осуществлялась с проверкой ограничения и в случае нарушения уникальности колонка ephone обновлялась. Как пофиксить?
Где phpMyAdmin хранит комментарии к ячейкам таблицы? Участвуют ли они в запросах? Есть ли разница в производительности запросов с ними / без?
Какой движок (MyIsam, InnoDb, другой?) подойдет лучше для ситуации:
2 таблицы, очень активная выборка из обеих (иногда даже ВСЁ берется), примерно 100000 записей в год в каждую (таблицы обнуляются каждый год! То есть максимум, который в них хранится = приблизительно 100000 записей).
Не будут ли тормозить запросы в конце года?
Я читал про статические таблицы, насколько понял, привел структуру полей в соответствие требованиям статической таблицы: поля типов char, int, decimal, date, timestamp (Если это важно для предыдущих вопросов).
Нормализация 3NF (Если это важно для предыдущих вопросов).
Одной из характеристик корабля является половина куба калибра его главных орудий (mw). С точностью до 2 десятичных знаков определите среднее значение mw для кораблей каждой страны, у которой есть корабли в базе данных.
Юзер (users) купил 4 товара (products) и в таблицу orders попали 4 записи. Напиать 1 sql запрос: Вывести сумму всех заказов пользователя за каждый день, если известен только email покупателя.
Добрый день. 1. Читаю всяких Кайтов, Дейтов и мне очень интересно. Прям хотелось бы все эти базы данных изучить изнутри и понимать, как там и что. Реляционная модель, вся хуйня. 2. Заканчиваю магистратуру хорошего технического вуза, встает вопрос об аспирантуре, потому что отсрочки от армии у меня нет. Есть ли в каких-нибудь московских вузах аспирантура, специализированная на базах данных? Гуглить я, конечно, буду, но здорово, если есть что-то известное и у всех на слуху. А еще идеально, если там не очень много нужно учиться и в смогу это делать без отрыва от своей основной работы.
Взываю к светилам. Это пиздец, доебал меня этот lock timeout уже. Суть: таблица T каждые пять минут по крону php скрипт ищет строки с NULL в определенной колонке. Затем в foreach делаем UPDATE SET WHERE id=определенному id
рядом другой крон агрегирует из этой таблицы посредством INSERT INTO T_AGR SELECT ... FROM T WHERE id в определенном диапазоне
Диапазон второго крона включает id первого крона
Сама система постоянно делает INSERT INTO T новых записей
Как это всё может выдавать lock timeout, с учетом того что по раздельности все это прекрасно работает?
>>921781 > Затем в foreach делаем UPDATE SET WHERE id=определенному id Пиздец какой. Открой для себя batch-операции. > рядом другой крон агрегирует из этой таблицы посредством INSERT INTO T_AGR SELECT ... FROM T WHERE id в определенном диапазоне Откроей для себя view. > Диапазон второго крона включает id первого крона > Сама система постоянно делает INSERT INTO T новых записей > Как это всё может выдавать lock timeout Действительно.
>>921787 >Действительно. Раз для тебя всё очевидно, тогда распиши мне пожалуйста какие блокировки за какими тут идут, потому как я не понимаю! Update - X, insert into select - X, insert - X Где тут происходит взаимоблокировка?
Не подскажите, какой из вариантов написания запроса более правильный точки зрения фен-шуя? Всё вместе: $request_copi_from_1c = "UPDATE `$name_table` SET `Оплата больничных листов` = ( SELECT `Оплата больничных листов` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ), `Оплата больничных листов за счет работодателя` = ( SELECT `Оплата больничных листов за счет работодателя` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ), `Оплата по среднему заработку` = ( SELECT `Оплата по среднему заработку` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ), `Оплата отпуска по календарным дням` = ( SELECT `Оплата отпуска по календарным дням` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ), `Отпуск дополнительный` = ( SELECT `Отпуск дополнительный` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ), `Пособие по уходу за ребёнком до 1.5 лет` = ( SELECT `Пособие по уходу за ребёнком до 1.5 лет` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ), `Дни неоплачиваемые согласно табелю` = ( SELECT `Дни неоплачиваемые согласно табелю` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ), `Месячная премия` = ( SELECT `Месячная премия` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ), `Компенсация отпуска при увольнении по календарным дням` = ( SELECT `Компенсация отпуска при увольнении по календарным дням` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ), `Аренда автомобиля` = ( SELECT `Аренда автомобиля` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ), `Всего удержано` = ( SELECT `Всего удержано` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ), `Удержание по исп. листу процентом` = ( SELECT `Удержание по исп. листу процентом` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ), `Удержание по исп. листу процентом до предела` = ( SELECT `Удержание по исп. листу процентом до предела` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ), `Удержание по исп. листу фикс. суммой` = ( SELECT `Удержание по исп. листу фикс. суммой` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ), `НДФЛ` = ( SELECT `НДФЛ` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ), `Всего выплачено` = ( SELECT `Всего выплачено` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ), `Перечислено в банк (аванс)` = ( SELECT `Перечислено в банк (аванс)` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ), `Через кассу (аванс)` = ( SELECT `Через кассу (аванс)` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ), `Перечислено в банк (под расчет)` = ( SELECT `Перечислено в банк (под расчет)` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ), `Через кассу (под расчет)` = ( SELECT `Через кассу (под расчет)` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ), `Конечное сальдо` = ( SELECT `Конечное сальдо` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id ) ";
Или каждый запрос лучше сделать отдельно для каждого столбца, типа $request_copi_from_1c = "UPDATE `$name_table` SET `Компенсация отпуска при увольнении по календарным дням` = ( SELECT `Компенсация отпуска при увольнении по календарным дням` FROM $table_1c WHERE $table_1c.`Организация` = $name_table.`ФИО сотрудника` GROUP BY $name_table.id )"; для каждого столбца.
У меня сейчас работает оба варианта (в дублирующихся функциях, лол), нужно оставить один вариант, а второй прибить.
>>925485 Этот поезд в огне, но по прежнему едет в Бобруйск!
А в транзакции я не умею. В планах освоить PDO, но сильно позже. Надо сначала хотя бы расчленить общий код на отдельные функции и немного оптимизировать их.
>>926307 Я кажется начинаю прозревать. По ходу это SASовская процедура, поэтому с SQLным синтаксисом нихуя и не сходилось. Знатоки подтвердите/опровергните плз.
Аноны, есть web прожект с Postgre, нужно будет хранить кучу изображений. Стоит ли заморачиваться и складировать их в БД(не советуют так делать, но мало ли), или же всё таки лучше в файловой системе их харнить?
ЕОТ Есть одна таблица. (user_id INT, category_id INT, amt INT) Строка соответствует действию пользоватеся user_id, тип действия category_id , цисловая характеристика amt. Пользователь может совершить несколько действий - user_id могут повторяться. Мне дан список из категорий с1, с2, с3... Требуется создать сводную таблицу по всем пользователям с полями: user_id, min_c1, avg_c1, min_c2, avg_c2,..... Если бы нужно было сделать только для с1, я бы сделал SELECT user_id, min(ant), avg(amt) FROM Table WHERE category_id=c1 GROUP BY user_id Для пары категорий можно было бы сделать как выше и объединить JOINом. Но как делать, если категорий штук 20? Хуярить 20 JOINов? Может что по-лучше подскажите?
>>926527 >>926528 Не совсем понял, зачем там динамик скл. Двачую PIVOT, но это тока в том Случае, если субд афтора в нее умеет. А, если нет, то можно нахуярить кучу CASE WHEN category_id = 1 THEN ... В каждое поле, соответствующее требуемой категории. Предпочитаю не бзать динамик скл там? Гле можно без него обойтись, ибо дебажить это дело потом - то еще удовольствие.
>>926276 >мёрджил This Вероятно, она у тебя залочеа мерджем. Выполни оцедуру sp_who2 и посмотри, какая сессия лочит сессию с селектом из таблички, все поймешь.
Если ничего не лочит, думаю, пора дроп-креэйтить индексы на ней.
>>926688 список категорий не детерминирован же. или, если автор имеет ввиду, что их 20 и он их все знает наизусть, - тогда оке. в случае хоть какой-нибудь динамики ты же не сможешь правильно написать PIVOT (... FOR ColumnName IN ([Value1], [Value2]))... я ведь прав, чи не?
>>926915 Если список не детерминирован, тогда не могу представиь, какой профит от того, чтобы выводить их просто в селект горизонтально. Или такое нужно для ssrs(или аналоге), в котором, все равно, есть такой элемент, как матрица, который сам разворачивает все, что душе угодно, или эти данные будут уложены в таблицу для последующего использования, но, в таком случае, какой смысл в неопределенном количестве полей таблицы? В общем, >>926527, какая цель запроса? Что дальше с этими данными будет происходить?
>>927070 Что ты как не посан. Изучи новое на простом примере, все поймешь и будешь знать полезную фичу, на самом деле, ничего сложного. Пайвот круче, чем куча кейсов.
>>927977 индексирование не является частью языка SQL и для реляционных хранилищ справедливо ровно настолько, насколько и для всего остального индекс - структура данных, ставящая перед собой задачу ускорения поиска элемента/ов.
собственно, на этом все. связь между быстрым поиском и увеличением производительности запроса, я думаю, найдешь
>>862801 (OP) Делаю БД (MSSQL) и клиентский интерфейс к ней (c#). Как правильно реализовать механизм добавления новых записей в таблицы? Хотелось бы не передавать голый SQL-код в базу, а запускать для этого хранимые процедуры. В идеале - иметь в клиентском приложении какой-нибудь метод по типу ExecDMLProcedure который будет принимать на вход имя процедуры и набор параметров. Ну и запускать на сервере процедуру с этими параметрами соответственно. Так вот собственно уточняю вопрос - как сделать так чтобы не писать для каждой хранимой процедуры еще и свой метод, а сделать процесс передачи набора параметров универсальным - например передавать один параметр в виде структуры, с которой уже БД сама будет разбираться и выдергивать из нее нужные параметры для INSERT-а в хранимой процедуре.
>>928169 > SP непонятная твое агро по поводу хранимых процедур и иже с ним. такие вещи используются тогда, когда нужно их использовать. в частности, можно упомянуть квази хай лоад (насколько он может быть хай с реляционными базочками), можно упомянуть просто статистику или некоторые высоконагружаемые сервер запросы. тем более, непонятно, кому там бьют ебало и за что. конечно, если твой опыт ограничивается проектами уровня SELECT * FROM Table, то мне нечего возвразить.
>>928178 Entify Framework, nHibernate - мастадонты ОРМной инженерии, творят чудеса, если возможности приложения позволяют Dapper, ServiceStack - наиболее распространенные в моей практике лол легковесные штуки, не дающие особо много вообще, тысячи их. ищи @ осваивай, если есть время (но нахуя)
>>928722 Да ладно. Тон его выебист, но у него есть мнение, которое, быть может, полезно знать. Вдруг это мнение приведет меня к тому, что я начну гуглить какие-то ключевые слова и найду для себя что-то новое? >>928591 Думаю, ему правда интересно, потому что ты производишь впечатление подкованного. Мне тоже интересно.
>>928579 Если ты не умеешь их писать, то это не значит что они плохи. Плохи люди, которые не знают TSQL или вообще базы данных мышкой программируют. Накидают селектов так, что оптимизатор запросов с его планами выполнения идет лесом и каждый раз новый план создает. И не говоря про то, что по сети от этих ваших фреймворковских "клиентских приложений" голый SQL-код летает. Зато АБСТРАКЦИЯ.
>>928781 Я видел как у ебанутиков веб-проекте вызывались хранимки: форматирование адресов, валидация, некоторые расчеты, набор случайных чисел... Т.е. за всем этим оно ходило по сети в оракл. Причем это были функции не читающие данных. Как быстро оно работало - можешь представить. И не надо кукарекать мол "можно! просто так не надо делать!". Это само получается - они реализовали функционал, а потом поняли, что он им нужен еще и тут и либо дублировать (а потом поддерживать два объема кода) - либо обращение в базу на каждый чих. Половина кода там, половина кода тут, еще часть продублирована (иначе совсем вообще тормозит) и они постоянно вынуждены были поддерживать две версии. И не самые тупые программисты были кстати. Всегда это заканчивается трешем. Просто не нужно этого делать изначально и всё. Хранимки - зло.
>>928781 Организационно код ("бизнес-логика"/"код"/) должны быть только в одном месте. Они не могут быть размазаны (иначе они будут и там и сям и немного здесь и тут вот два этапа одно и то же). И это место - основной код, но никак не БД. Концептуально нарушается базовый принцип "модель" - это "данные". Нарушение этого принципа даже в рамках основного кода заканчивается еще плохо, нарушение до степени что возникает "хранимка" - совсем пиздец. Если ты начнешь в процедуры, то сразу начнешь создавать результаты, которые не мапятся на твою объектную модель, это обязательно (поверь) кончится read-only сущностями, которые изменить и вернуть в базу нельзя никак в принципе (нет обратной проекции и всё). Вообще, даже руками, не говоря уже про ORM. Всё обязательно заканчивается дублированием. Если не дублировать, то начинается цирк вроде вызова хранимок для задач, которые вообще никак не связаны с данными и получается совсем уже конченый проект. У оптимизатора меньше возможностей оптимизировать их. Дальше всё равно начинается склейка SQL запроса кодом (но теперь уже в хранимках! это тебе не уродство ручной клейки запросов питоном! это лучше, это хранимочка!). --- Они не переносимы. Во-первых синтаксически. Во-вторых они всегда так или иначе используют еще и всё остальное. Т.е. начинают использоваться замысловатые возможности, которых нигде больше нет. И тогда проект становится 100% непереносим никак вообще. Они неудобны в написании - (степень уёбищности языка на усмотрение вендора). Другие языки вроде языкнейм - теряют все "преимущества" (т.е. обещанные "преимущества" хранимок, т.е. которых нет) PL*/SQL и выглядят в итоге всё равно так же как "клиентский" код. В дополнение они могут иметь ряд своих проблем. Их трудно нормально версионировать и отлаживать. Они отдельный элемент деплоймента. Они отдельный элемент управления правами.
>>928803 >Если ты не умеешь их писать Слышь ты, июнь-тестировщик. У тебя в dynamic sql security definer хранимке возникла sql injection, всю твою базу распидарасило и тебя уже выкинули на мороз. Домой не приходи, я тут пока мамку твою ебу. Попиши хранимок пока.
>>928817 >Они отдельный элемент деплоймента. >Они отдельный элемент управления правами. Они отдельный элемент борьбы директора по продажам против директора по развитию и прочих ссучёных сук. Об этом бы лучше подумал, а то «питон», «питон»...
>>928823 Спасибо, я в отличии от тебя, мудака, проверю че мне там на вход пихают. Видимо от инъекций в свой ОРМ-овский говнокод ты уже успел пострадать.
а вообще хуй знает зачем тебе хранимки У них только один кейс - если у тебя много разных десктоп клиентов, и нет унифицирующего ебиного api-сервиса, ну так вроде не 20 век, трехзвенка везде, и любой бекенд язык выразительней любого sql расширения. К тому же не все data-orintied, а process-orintied на хранимках особо не попишешь, вот и выходит что все равно приходится писать логику на стороне api-сервиса. А мешать код на бекенде с хранимками - говноедство, так как раздуваешь систему, теряешь реюз и композабельность. Бизнес требования по своей природе декларативны, нахуя их описывать язычком с выразительностью уровня шелл-скрита? Пока пацаны пытаются сделать процедурную парашу хоть немного юзабельней, запиливая датамаперы типа LINQ, говноеды даже где не надо обязательно хотят все засрать своими процiдурками. Вот чому вы такие пидары, a?
>>928921 >язычком с выразительностью уровня шелл-скрита ты что там же можно JS пускать прям в БД и писать на ЖС, делая из него SQL запросы в базу будучи в хранимке в самой же базе, на ЖС. т.е. они пришли к тому же от чего пытались уйти.
Вы тут спорите о выразительности и идеальном архитектурном решении, но на практике все упирается в эффективность. Иногда возникает необходимость делать тонны разных запросов, обрабатывать их и в результате получать определенное значение. Такое дерьмо выгоднее делать на стороне сервера. >>928931 > они пришли к тому же от чего пытались уйти Никто от этого не пытался уйти. Если в твоем крудошепстве нет необходимости в хранимках - это не значит, что для остального мира они не нужны.
>>928993 насколько должно быть здоровое приложение, дабы разбивать кодэ и источники данных по отдельным машинам? не самое легковесное приложение все-равно вертелось рядом с скл-сервером и позволяло запустить несколько тестовых инстансов
>>929136 Представь, что у тебя это все запущено на одной машине. Представь, что ты выгружаешь из бд большой объем данных, потом эти данные запихиваешь в переменные в своем проекте. Тебе на все это дерьмо нужно гораздо больше памяти, чем на сценарий, когда все это происходит в рамках субд.
Как применить тяжелый патч к базе на проекте, чтобы его пользователи во время обновления не сосали жопу, а продолжали работать? Допустим, там есть много update и altertable. Если сделать дамп и патчить его, а потом - хоба - и быстро подменить таблицы со старых на новые, то надо как-то дельту же еще применить (изменения во время патча). Через sql-логи? Вообщем, какие тут лучшие практики?
>>929316 Чувак, даже какие-нибудь ВК или ОД приостанавливают работу на несколько минут ради апдейта. Все те 5 пользователей твоего стартапа переживут эти несчастные 10 минут.
>>929316 >лучшие практики накатывать в период наименьшей активности пользователей, очевидно
>>929357 хех, ну социалочки имеют сотни нод и могут делать апдейты серверов ван-бай-ван без потери производительности. опять таки не в самый пик наплыва школьников. хотя, может быть я что-то не знаю
>>928988 >нет необходимости в хранимках - это не значит, что для остального мира они этот вот твой остальной мир это клоака в которой нормальные люди работать не хотят. с соответствующими задачами и развитием.
>>929452 > хранимко-днища лол, я тут прям грудь рву за SP
> nosql > кеширование когда вопрос становится об ускорении лишь некоторой части DAL-вызовов, отдельный датасторадж будет выглядеть обузой, не? запрос из кеша будет сильно по времени приближен к запросу в основное хранилище если, например, строится динамическая статистика из-за своих промахов. плюс такой временный загон данных в кэш имеет шанс вытолкнуть востребованные данные (или нет)
>>929683 А скажи-ка ты мне малтщик. Когда текст твоего нормально написанного sql-запроса размножили нажатием Ctrl+C/V в десяти местах, кто за вами подтирать, будет!!!
Есть пет проектик в котором нужно хранить информацию о юзерах, в терминах реляционной бд - порядка 16 колонок. И очень часто прийдется делать выбирорки юзеров по критериям с для этих колонок(чаще всего по всем 16).
Правильно ли я понимаю, что no-sql для этой балалайки не подходит? Есть компромисные решения?
Есть какие-нибудь обзорные статьи/лекции по разным субд? mongodb, postgresql, mysql и т.д. Какие для чего нужны? Какая производительность, плюсы минусы и т.д.
Не знаю куда написать еще, так что напишу сюда. Помогите настроить ебучий роутер, я случайно сбросил на заводские настройки его и пиздец, пробовал делать все по инструкции билайновской, но там толком нихуя не написано, просто заполнить поля и всё.
Sup! Тыкаю палочкой в постгрес, хочу перекатить свою приложуху на нее. Короч, в чем прикол. Создал для теста базу, забил рандомной херней типа логинов "admin", "root", etc Теперь делаю из нее select, затем print("<",login, ">", password) и тут его пидорасит смотри пикчу. Это я базу неправильно настроил или что?
Посоны, нужен ваш компетентный совет. Мне нужна субд, да не простая, а пиздатая. Короче, рассказываю суть. Мне нужно хранить строки в БД и иметь к ним быстрый доступ. Знаю, что обычно эта проблема решается индексами, но у меня количество строк в таблице ограничено, и поэтому я бы хотел вместо индексов использовать хэш-таблицу. Поскольку я нуб и в душе не ебу, какие бывают хэш-функции в субд, у меня несколько вопросов: 1. Есть ли хэш-функции, которые принимают заранее заданное количество значений? Я смотрел в инетике, но там всякие md5 принимают строго фиксированный диапазон значений. 2. Вытекает из первого: есть ли субд с широкой поддержкой хэширования? Ну чтобы не ебя мозги можно было просто задать размерность таблицы, а субд сама бы подбирала и генерировала хэш-функцию и можно было сразу работать. Ты в бд строку - она тебе индекс. Ну что-то в этом роде. 3. На самом деле я хочу захуярить не одну, а несколько таблиц с фиксированной размерностью и хранить в них строки. Поэтому неплохо было бы, чтобы субд поддерживала секционирование.
Эксперты БД, нужна ваша оценка. В общем, надо создать БД для пациентов. Но основная задача это хранить рентгеновские снимки, мрт, еще что-то. Т.е есть чел, и к нему я добавляю снимок ноги, через три дня еще один снимок, через наделю еще. Вот, как лучше сделать, чтоб не обосраться? Я так полагаю, нужна будет еще локальная база?
>>932788 Почему? Ну я не очень понял, но вроде если основная база недоступна, то все сохраняется в локальную >>932789 Да это мой диплом. Там будет сама приложуха для некоторого анализа ОКТ и вот такая база.
Имеется такое задание по Microsoft SQL Server. В общем, имеется база данных. Там есть таблица Сотрудники с полями (СотрудникID, ФИО, Должность), СотрудникID - первичный ключ. Также есть таблица ПриходСклад с полями (СкладID, ДатаПоставки, Приемщик), СкладID, ДатаПоставки - первичный ключ, Приемщик - вторичный ключ таблицы Сотрудники(СотрудникID). Задача - добавить в таблицу Сотрудники столбец Дата приема, установить значения в этом столбце для кладовщиков равными дате их первой поставке.
В общем, первую часть (создание столбца) я сделал. ALTER TABLE Сотрудники ADD [Дата приема] date NULL
Со второй частью никак не получается UPDATE Сотрудники SET [Дата приема] = (SELECT MIN(ПриходСклад.ДатаПоставки) FROM ПриходСклад) WHERE Сотрудники.СотрудникID IN (SELECT DISTINCT Приемщик FROM ПриходСклад) Дата приема устанавливается одинаковой для всех кладовщиков, что понятно. Как сделать, чтобы через SET устанавливались разные даты для каждого кладовщика? К слову, запрос SELECT MIN(ПриходСклад.ДатаПоставки), Приемщик FROM ПриходСклад GROUP BY Приемщик возвращает именно нужные даты, как их присвоить Дате приема?
>>933479 Спасибо. Сработал этот запрос UPDATE Сотрудники SET Сотрудники.[Дата приема] = (SELECT MIN(ДатаПоставки) FROM ПриходСклад WHERE СотрудникID = Приемщик)
>>933697 тебя ебет какие данные? лол. Анонимус настолько отупел, что не может представить абстрактные данные? Просто выбрать данные из нужной мне таблицы в колоку - 1 декабря 2 декабря .. 31 декабря
Сам нашел что-то типо этого. SELECT DATE(insert_time), SUM(value) FROM table1 WHERE insert_time >= '2013-05-01' AND insert_time <= '2013-05-31' GROUP BY DATE(insert_time)
>>933739 Это ты настолько отупел, что не можешь сформировать понятно задачу, ждешь помощи, а еще агришься на все подряд, тебя спрашивают, какие данные, потому что к ним нужно как минимум применить агрегатную функцию. Еще обычно принято писать так: Есть 2 поля: insert_date и amount в субд postgreSQL, каким запросом можно выбрать сумму amount для каждой даты (insert_date)?
На стаковерфлоу тебя бы обоссали, а тут только по морде дали. Пиздец, еще кого-то тупым называет, иди, блять учи русский язык сначала, а потом основы sql.
>>933739 >абстрактные данные посылаю тебя на абстрактный хуй >Сам нашел что-то типо этого И что, сложно было? Думаю, что нет. Потому ты и был нахуй послан.
>>934679 Да что тут можно интересного рассказать? Довольно тривиальная штука же. Пару небольших заметок напишу. 1. Иногда можно обойтись меньшим количеством индексов. Например есть таблица table(field1, field2) и нужно ускорить поиск для запросов типа "... where field1 = ..." и "... where field1 = ... AND field2 = ...". В этом случае достаточно одного индекса по обоим полям сразу (field1, field2), причем важен порядок полей в индексе, т.е. индекс (field2, field1) сработает только для поиска по двум полям сразу (либо для поиска по field2). 2. Индексы не обязательны для применения. Так планировщик запросов может решить, что быстрее будет пробежаться по таблице полностью (full scan), чем обращаться в индекс. Это зависит от количества записей в таблице и набранной статистики. У меня был случай когда запрос выполнялся 12 секунд (большая таблица и слабое железо на тестовой машине) из-за того, что планировщик решил что так быстрее. Когда я заставил его использовать индекс (есть у postgres такая опция) запрос выполнился за 6 секунд. В таком случае может помочь vaccum analyze.
>>934721 это ты рассказал то, что я могу в любой статейке почитать как формируется значение для индексированной записи? есть у меня, скажем, таблица Kek {Id, Date, OptionId, SomeBinaryData} и есть PK {Id, Date}. я могу забомбить запрос с WHERE Id = @lel AND Date = @azaza, тогда индекс будет использоваться на полную катушку. а могу так: WHERE Date = @azaza AND Id = @lel. запросовыполнятор может (ну, допустим, будет) использовать индекс. конечно, неэффективно, но что позволит ему быстро (быстрее) скакать по дереву с учетом ебанутости меня как запрашивающего? я ведь могу указать только вторую колонку.
>>934733 Я ж не DBA какой-нибудь. Джойны - это один из вопросов на собеседовании на жавамакаку. Много кто рисуют пикрелейтед, а когда даешь задачу просто сджойнить всеми способами две таблицы - сливаются. Ну это джуны, в основном. Часто путают full outer join (снизу слева на пикче) с вариантом снизу справа.
>>934744 >это ты рассказал то, что я могу в любой статейке почитать Чувак, на дворе 2017 год - о всем можно прочитать. А уж в /pr не будет откровений и сакральных знаний передающихся из уст в уста. >PK {Id, Date} Странная штука - так делать. Ты PK с обычным индексом не перепутал? >конечно, неэффективно С чего ты решил что есть какая-то разница? От перестановки условий в where результат не изменится. >я ведь могу указать только вторую колонку. Тогда индекс не сработает. Я же писал, что важен порядок полей в индексе. В твоем случае с PK {Id, Date} он сработает либо для поиска по Id, либо для поиска по Id и Date одновременно.
>>934756 >Странная штука - так делать ачо? я часто видел ID + дата либо ID + FK в качестве кластерного индекса
>о всем можно прочитать ну не знаю, это вроде бы внутренности реализации. хотя я могу ошибаться
>что есть какая-то разница умные люди на хабре напесали. да и не только, источник я просто так не вспомню (MS SQL если чо. там же есть разница и она может быть существенной?)
Нужно выбрать значения из бд (Оракел), которые являются вычисляемыми. В расшифровке таблиц написано Storage - Calc. Те столбцы, у которых Storage - DB селектятся нормально.
Помогите, пожалуйста. Погуглил, что-то ничего похожего на мое не нашел (плохо искал, видимо).
Посоны, нашел на специалисте сертефицированные курсы по sql server администратору за 50к че как думаете годно? Хочу постепенно вкатиться в тему, сам как аналитик юзал нубский аксесс на уровне нубского конструктора и вот подумал а че бы блядь и нет? Стану sql макакой, тянки, успех, профит.
Подскажите по теории БД!!! Немного запутался в определениях вот у меня задача Есть мн-во A={a,b,c,d,e,f} мн-во отношений S={{a}->{b,c},........} нужно проверить, что {a,d} - ключ. через замыкания.
Так вот, есть 2 стула свойства 1 уникальность - это когда замыкание {a,d}+ = A 2 неизбыточность - как я понял, это когда {a}+ !=А и {b}+ !=А Если замыкание {a}+ =A, то {a} - уникален, и ад - не ключ Я правильно все понял, или где-то проебался?
Поясните, как в базе данных сохранять содержимое статьи для типичного сайта? Статья включает в себя текст смешанный с изображениями, несложные элементы html-форматирования текста, такие как подчёркивание или выделение жирным и собственно теги для вставки картинок. Работаю с PHP+PDO+MySQL.
Студентота, инженерная специальность, предстоит курсач по базам данных(окологис-технологии). Знаний SQL нет совсем (только немного реляционная алгебра и создание БД библиотеки на информатике, ну и некоторые основы программирования). От преподов толку нет. Нихуя не понимаю как начать вкуривать основы, пытался гуглить, но все гайды заточены под ms sql или mysql, а там свои отличия как я понимаю, а у меня нет времени на разбор. Короче реквестирую учебник по SQL, заточенный именно под POSTGRE.
БД-господа, выкинулсяли из университета и теперь сижу дома. Чтоб я пробзделся, батя мне задал такую задачу: перевести базу клиентов из экселя в аксес, попутно прикрутив интерфейсы и прочие свистоперделки, также, возможно, в будущем придется добавить поддержку работы с ней по локальной сети с нескольких компьютеров одновременно. Хватит ли для реализации этого проекта книг с оп-пика генерального треда /pr про SQL или же придется воспользоваться дополнительной литературой? Если да, то какой?
>>943976 Чтоб устройство понять баз данных, чтоб интерфейсы нормальные сделать. Бейсик тоже придется задействовать, по моим ощущениям. Я ж в этой области вообще ноль полнейший. А книга - друг лучше любой собаки.
сап, анании. как лушче хранить деревья в бд? видел тему с ключами (типа AAAA у родителя, AAAB, ..., AAZZ у детей и т.д.), чтоб можно было доставать всех детей. кто что считает?
>>945253 можно и квадратные скобки поставить по, я так понял, вся хуйня кроме as это синтаксический сахер например, для подвыражений без ас не сработает, вроде бы как
Сап, анон. Я нуб, который решил начать изучать SQL по Бьюли, и обосрался в самом начале. Суть вот в чем: В MySQL есть 2 таблицы (пикрилейтед). Они были связаны внешним ключом по person_id, но я его дропнул, потому что он не давал мне поставить авто-инкремент в первой таблице. В общем я его поставил, и теперь пытаюсь вернуть внешний ключ через ALTER TABLE. Но нихуя, он возвращает ошибку "error 1215 cannot add foreign key constraint" Может есть идеи в чем может быть проблема?
>>951629 Начнём с того, что в таблице "person" этот ключ должен называться просто "id". Добавим к тому, что ты только что полностью разрушил свою БД, создавай её заново.
>>951699 То есть названия столбцов для первичных ключей в разных таблицах не должны быть одинаковыми, я правильно понял?
В чём все-таки моя ошибка? Как правильно привязать эти столбцы внешним ключом и не обосраться снова? Плюс, мне нужно чтобы столбец с айдишником в таблице "person" сам его генерировал при заполнении ее новыми данными (почему я и поставил авто-инкремент, а вообще планировал заполнить столбец значением "null", но не вышло, пришлось так изъебнуться).
MSSQL. Нужна база данных продуктов и рецептов, чтобы по перечню продуктов искать рецепты, в которых есть все продукты из списка (одного-два может не хватать) Препод уже месяц отказывается принимать решение со стандартным "многие ко многим" и костылями типа "создать 100 полей для продуктов в каждом рецепте и разрешить NULL", говорит что есть какой-то более годный способ, а я думать не хочу. Какие соображения у треда на эту тему?
Попрошу совета. Я хочу уметь в базы данных, потому что часто вижу в вакансиях умение всяког на Сиквеле, Постгре и разного Мемкеша, Монго.
Как я вижу - ёпте, база данных, в ней данные. Обычно ЯП сам делает туда запись. И сам же оттуда достаёт, что ему нужно, только путь укажи. Если надо ручками - залогинился, селектнул, удалил\добавил. Но я подозреваю что пикрелейтед. Ткните меня, где я обосрался и куда копать? Что почитать, как понять как под капотом работает или какие КУРСИКИ пройти?
>>953725 >и костылями типа "создать 100 полей для продуктов в каждом рецепте и разрешить NULL" Вот такого нету, например. Можно ещё сделать составной ключ из тройки (Готовый Продукт Код, Ингредиент Код, ИД_рецепта) и убрать поле Код, но зачем?
>>953735 Так их и в N:N нету. Утвержается, что есть некий способ в ущерб объему данных (то есть избыточность) относительно N:N увеличить скорость поиска рецепта по продуктам в разы. У меня идей нет никак.
>>862801 (OP) Итак, анон, есть reg-файл. Это вот дело служит паролем для базы данных. Насколько я понимаю, dword 83 это какой-то сдвиг фразы "Увррфмсз", потому что когда я ставлю значение 0, то захожу в базу по этой фразе. Как узнать, какая фраза выходит после этого сдвига? Он как-то по ASCII вперед на 83 символа сдвигается или как?
>>953636 Ну самый очевидный способ это реализовать - запилить таблицы с ингредиентами, рецептами, рецепты_ингредиенты. Алгоритм поиска - искать id в таблице ингредиентов нужный, потом уже в таблице рецепты_ингредиенты искать рецепты по id ингредиентов. Ну и в техническом плане там на колонку с названиями ингредиентов повесить индекс, и ещё индекс на колонку с ингредиентами в рецепты_ингредиенты.
господа, посмотрите на мой высер... пилю бд тип для выдачи кредитов с предварительным анкетированием. меня интересует насколько правильно (и если не правильно поправьте пожалуйста) поставил связь, которая на пикрелейтед помечена знаком вопроса. Так же правильно ли я организовал хранение ответов в анкете пользователя(таблица в красном квадрате). ну и так в общем может есть какие замечания, я обязательно учту.
>>954714 значит связь с контрактами и кредитными продуктами там не лишняя(красный знак вопроса на схеме)? система с опросом(кредитный скоринг) такова: есть скоринговая карта(scoring_map), у этой карты есть вопросы(question), к каждому вопросу есть несколько вариантов ответа (case) (для каждого варианта свое количество балов), и вот мне надо будет хранить пройденную анкету пользователя(test_result), где будет храниться сумма набранных баллов. выбранные варианты ответов, решил хранить в таблице выделенную красным квадратом на схеме. правильно ли так делать как сделал это я? плюс если в вариантах ответа есть "добавить свой вариант" (которого нет в анкете), пользователь пишет конкретно свой вариант, но этот "вариант", который ввел пользователь, должен быть привязан к конкретно тому пользователю, который его вводил. надеюсь понятно объяснил
>>954730 >>плюс если в вариантах ответа есть "добавить свой вариант" (которого нет в анкете), пользователь пишет конкретно свой вариант, но этот "вариант", который ввел пользователь, должен быть привязан к конкретно тому пользователю, который его вводил
>>954735 >>Scoring_map - это некоторый набор анкет? совершенно верно >>Я бы на твоём месте подумал о переиспользовании вопросов для разных анкет (N:N) т.е. мне еще между таблицами scoring_map и question запилить еще табличку с полями id_scoring_map и idquestion. так?
>>954738 Да. Шансы на то, что у тебя для разных анкет будут пересекаться вопросы - около 100%. Вообще, если идти по пути повторного использования данных, то можно много чего найти. Но это уже если надо будет. Просто это наиболее вероятное, что может пригодиться.
>>955213 Подумай ещё над схемой. Мне кажется, с анкетами тут всё не так просто, как кажется. Информацию про шаблон анкеты было бы неплохо с результатом анкетирования хранить. В этой схеме выходит, что нужно перелопатить таблиц кучу, чтобы id шаблона найти.
>>955243 если честно больше ничего в голову не лезет. тут в принципе действительно было бы неплохо иметь возможность переиспользования вопросов из анкет. я это впринципе и сделал. а вообще просто по сути мне нужно хранить значение набранных баллов клиента, с целью выдать ему кредит или нет, и на какие вопросы как он отвечал. я сейчас сделал это так: в таблицу test_result добавил поле scoring_map_id, и связал таблицы scoring_map 1:N test_result. и получается, когда мы смотрим результаты анкетирования, мы можем посмотреть какие анкеты клиент проходил, и что он там отвечал. насколько это правильно? может подскажешь как бы ты это реализовал.
>>957829 Братишка, с access всё очень сложно. В универах, например, его рассматривают на уровне схем максимум, потом идёт sql. Всё как в жизни. Скорее всего, придётся выбирать самому.
Сап, анон. Подскажи, плез, как в Oracle можно сделать нумерацию сотрудников по отделам (аналогично row_number() over (partition by) ), используя конструкцию with as?
Аноны, помогите правильно спроектировать базу. Есть контора, которая осуществляет испытания. От клиентов принимаются заявки. В каждой заявке указаны виды испытаний (может быть несколько). Т.е. я предполагаю наличие сущности "Заявка" и наличие сущности "Виды испытаний", связь многие ко многим. По каждому виду испытаний есть несколько показателей, которые надо измерить. Опять предполагаю сущность "Показатели" и связь многие ко многим с "Виды испытаний". По каждому виду испытаний в заявке составляется протокол, где должны быть указаны фактическое и требуемое значение показателей. У меня трудности, как связать сущность "Протоколы" с имеющимися. Правильнее будет связать с "Заявками" как многие к 1? Или же с промежуточной таблицей "Заявки_Виды"? И как сюда привязать показатели? Создать промежуточную таблицу с атрибутами ID_протокола, ID_ВидаРабот, ID_Показателя? Спасибо
>>964553 Поздно уже, сегодня не смогу помочь. Ну и тот факт, что я с трудом понимаю, что же тут на самом деле-то происходит, тоже нифига не помогает. Это какая-то супер обобщённая модель aka laba1 или есть какие-то шаблоны, стандартные наборы? Например, стандартные протоколы, виды работ, показатели, нормы.
>>964565 В общем, фактическое значение из таблицы "Показатели" убрать мне надо, так как есть в соседней таблице. Таблицы "Виды работ", "Показатели" - в качестве справочников.
>>964640 Ну та часть, что ты словестно описал, выглядит правдоподобно.
Пару вопросов: 1) На каждый протокол только один инженер-испытатель? 2) У тебя на каждый вид работ в заявке может быть несколько протоколов. Так было задумано?
>>964945 >>964565 Теперь вроде всё норм, а чтобы не делать много протоколов по одному виду из одной заявки, добавлю ADD CONSTRAINT UQ_Заявки_Виды UNIQUE (ЗаявкаID, ВидРаботID).
Gомогите с Access, а то я тут горю просто. Как сделать запрос на промежуток данных. Конкретно дат. пишу WHERE [Дата] Between #1/1/2017# And #31/1/2017# Пишет задано значение для операции без оператора. Может ему как-то конкретно надо на дату указать, как это сделать ?
Ребят, я к вам из PHP-треда, только -только вкатываюсь в MySQL. Имею БД students, хочу создать в ней следующую таблицу: CREATE TABLE student ( name VARCHAR(30), surname VARCHAR(30), gender VARCHAR(30), group VARCHAR(5), mail VARCHAR(20), score SMALLINT UNSIGHNED, yearofbirth YEAR, placeofbirth VARCHAR(10), password VARCHAR(40));
и вылезает вот это: ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group VARCHAR(5), mail VARCHAR(20), score SMALLINT UNSIGHNED, yearofbirth' at line 5
Господа, есть один MS SQL сервер, база в нем, хранимка в базе. Хранимка выполняет роль поиска по этой базе. Представляет собой простой селект, объединяющий кучу таблиц через left join и сотней условий в where. Типа: SELECT * FROM ( SELECT a, b, c FROM table1 join table2 join table3 )
Вся эта хуйня дико тормозит, хочу переделать.
Есть какой-то нормальный способ делать поиск по БД? Без хранимки на 100 параметров, без объединения всех-всех таблиц?
СЕЛЕКТИМ мусор из помоек,
срёмся, какая субд хуже, решаем простые задачки на -T-SQL на собеседованиях,
поясняем за правильную табуляцию в запросах,
креэйтим колоночные индексы на таблички, в которые идёт инсерт и реализуем прочие хорошие практики разработки БД.
В треде приветствуются все: от студаков с обоссанными лабами до любителей анализа данных и машинного обучения.
Постим свои эс-ку-эли-сиквели-транзакты, хвастаемся понятным и без комментариев читаемым кодом с вложенными запросами,
решаем прикладные задачи Тети Вали из бухгалтерии "А сделайте мне программку" на уровне архитекторов. Убеждаем залётных, что в тырпрайзе софт не нужен, а автоматизировать можно всё и на процедурах-триггерах-Икселях.