Какие кодирующие приемы Вы раньше старались не писать большему количеству sql?

Вы можете попробовать это:

WITH 
    C0R_Count AS (
        SELECT /*+ materialize */ 
        sku_id, count(location_id) as Bulk_Count
        FROM Inventory
        where location_id like 'C0R%'
        group by sku_id),
    C0S_Count AS (
        SELECT /*+ materialize */ 
        sku_id, count(location_id) as Bin_Count
        FROM Inventory
        where location_id like 'C0S%'
        group by sku_id)
SELECT RANK() OVER (ORDER BY nvl(Bin_Count,0)+nvl(Bulk_Count,0) DESC)as Count_Rank,
       Inventory.sku_id, Bin_Count, Bulk_Count, 
       (nvl(Bin_Count,0)+nvl(Bulk_Count,0)) as Total_Count
FROM Inventory
Left Join C0R_Count
   on Inventory.Sku_id = C0R_Count.Sku_id
Left Join C0S_Count
   on Inventory.Sku_id = C0S_Count.Sku_id
WHERE 
   client_id = 'SDRY-US' 
   and site_id = 'USCOL1' 
   and (nvl(Bin_Count,0)+nvl(Bulk_Count,0)) > 9
GROUP BY Inventory.sku_id, Bin_Count, Bulk_Count
;

Когда вычисляются нулевые значения, они становятся нулевыми.

7
задан 5 revs, 3 users 60% 23 May 2017 в 11:55
поделиться

11 ответов

Где я работаю, мы сделали несколько вещей уменьшить SQL и уменьшить связанные издержки использования SQL в Java. (Мы выполняем Java с MSSQL, MySQL и Oracle).

Самый полезный прием должен использовать setObject метод Java для обязательных параметров. Это, объединенное с Varargs, позволяет Вам записать служебный метод для выполнения SQL:

DBUtil.execSQL(Connection con, String sql, Object... params)

Просто выполните итерации по параметрам и используйте statement.setObject (индекс, параметрический усилитель [индекс 1]). Для пустых указателей Вы используете setNull (). Мы расширили это понятие для запросов с getResultSet методом; перенесенный объект ResultSet также закрывает свой оператор, помогая сделать управление ресурсами.

Для сокращения фактического записанного кода SQL у нас есть платформа создания запроса, которая позволяет Вам указать набор столбцов и их типов, и затем использовать это, чтобы автоматически указать критерии поиска и произвести столбцы. Мы можем легко указать соединения и присоединиться к критериям, и это обрабатывает большинство нормальных случаев. Преимущество состоит в том, что можно генерировать отчет приблизительно в 10 строках кода, включая различные параметры запроса, сортировку, группировку, и т.д. Код слишком сложен для включения здесь.

Я также использовал таблицы ALL_TABLES и ALL_TAB_COLUMNS Oracle для генерации операторов SELECT; другой прием, который я использовал, использует ResultSetMetadata для анализа таблицы:

ResultSet rs = DBUtil.getResultSet(con, "SELECT * FROM " + someTable);
ResultSetMetaData rsm = rs.getMetaData();

boolean first = true;
for (int i = 1; i <= rsm.getColumnCount(); i++) {
  String col = rsm.getColumnName(i).toUpperCase();
  // do something with the column name
}

Это помогает генерировать определенные виды операторов; в этом случае у нас есть активная таблица и архивная таблица, и мы перемещаем записи от одного до другого. Не входя в дебаты об использовании архивной таблицы, код Java, который я написал, позволяет мне изменить эти две таблицы, не имея необходимость изменять сценарий архивации.

Другой прием, который мы используем, должен использовать константы для всех наших имен таблиц и имен столбцов. Это делает вывод SQL немного утомительным, но он позволяет нам (среди прочего) генерировать SQL легко для таблиц с подобной или идентичной конструкцией. Так как мы используем константы для определения имен столбцов, код на самом деле осуществляет это, идентичные столбцы имеют то же имя. Используя константы также позволяет Вам найти ссылки на конкретный столбец, таким образом позволяя Вам исследовать другие SQL-операторы, которые могут быть связаны с работой, которую Вы делаете. Это позволяет нам повторное использование SQL от других модулей, вместо того, чтобы вслепую переписать тот же оператор снова.

1
ответ дан 6 December 2019 в 10:54
поделиться

Если Вы не хотите писать, что SQL использует ORM, такой как nHibernate или одно из предложений Microsoft Linq к SQL / Платформа Объекта

Это еще лучше затем использует генератор, так как Вы не должны будете повторно выполнять генераторы, и если Вы используете Быстрый nHibernate, можно включить Конфигурацию с помощью Конвенции и даже не поддержать отображающийся файл / класс.

10
ответ дан 6 December 2019 в 10:54
поделиться

Генерируйте SPS SQL, Представления, и т.д. от метаданных в INFORMATION_SCHEMA. Та генерация кода может затем быть увеличена с пользовательским кодом.

Если много SPS сделают подобные вещи, для простоты единственной точки обслуживания, я генерирую динамический SQL вместо этого.

Все эти вещи приводят к меньшему количеству кода SQL и большему количеству кода, который снова используется и так лучше протестированный - как любая библиотека.

Вот пример генерации кода, чтобы не писать SQL

2
ответ дан 6 December 2019 в 10:54
поделиться

Язык: C#/VB.NET.

Я в настоящее время могу писать, что DB поддержал систему, не пишущий SQL вообще. Мой DAL использует определения классов POJO для генерации SQL на лету. Пример:

SearchCriteria sc = new SearchCriteria();
sc.AddBinding("Customer_id", "ALFKI");
List<Entity> customers = SQL.Read(sc, new Customers());

Код выше возвратит список Клиентских экземпляров, соответствующих Customer_id к "ALFKI". Подключения DAL к дб, создает SQL, выполняет его, инстанцирует новых объектов, заполните их и передайте их обратно. Когда Вы будете сделаны, изменяя объекты, просто звоните

SQL.Write(customer);

все изменить объекты, обновленные назад к дб - обратите внимание, только те, которые изменились и только столбцы, которые изменились.

Добавленная премия: это поддерживает SQL Server, Oracle, Informix. Клиентский код никогда не должен изменяться.

2
ответ дан 6 December 2019 в 10:54
поделиться

Я использовал выход-orm, который является потрясающим решением ORM, которое не генерирует. Я думаю из всех приемов, которые я сделал в прошлом, этот был безусловно самым удобным и экономящим время.

0
ответ дан 6 December 2019 в 10:54
поделиться

Я прокрутил свой собственный ORL (Объектно-реляционный Картопостроитель) в PHP для MySQL. Это действительно упрощает все, что имеет отношение к изменению базы данных, и это работает очень хорошо на простые ситуации.

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

<?php
class CSomething extends CDatabaseObject
{

}

// create a new Something
$oSomething = new CSomething();
$oSomething->somevariable = 'blah';
$oSomething->Save();

// fetch an old Something by primary key
$oSomething = new CSomething(1);
// .. and delete it
$oSomething->Delete();
?>

Это автоматически выясняет индексы в таблице и первичный ключ. Если это требуется, можно, конечно, сказать классу эти вещи, если это делает что-то плохо.

Можно сделать простые поиски путем определения оператора Where SQL (таким образом, это не полностью свободный SQL). Начиная с него nows о типах данных полей параметризированные запросы просты.

Конечно, это не может сделать всего, в чем я нуждаюсь, но это сохраняет много времени разработки и кода.

2
ответ дан 6 December 2019 в 10:54
поделиться

В одном из моих проектов я использую метамодель (таблицы, столбцы, отношения), который добавляет информацию к встроенному sys* представления.

Часть данных в моей метамодели используется для генерации регистрирующихся триггеров для, вставляют/обновляют/удаляют, и реализовать расположение каскадом удаляет во вместо, удаляют триггеры. Приблизительно с 100 таблицами сгенерированный код для этих триггеров является приблизительно 12 000 строк кода TSQL.

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

Недавно метамодель даже позволила мне генерировать код C# для, удаляют проверку (т.е. не может удалить запись, если зависящий записи существуют) у находящегося в FormView Asp. Сетевые формы.

1
ответ дан 6 December 2019 в 10:54
поделиться

Я рекомендую создать совместно использованные методы, которые фокусируются на задаче и используют простые элементы SQL, не имея необходимость писать sql. Я использую Дозвуковой для моего доступа к данным к MS SQL. Однако Вы могли сделать его не - база данных конкретный, такая как DAL. Эти примеры могли быть настроены к ORM, или однако Вы получаете доступ к данным. Я рекомендовал бы создать статический класс что narrow's это вниз к определенной задаче.

Например, если у Вас есть datagrid для заполнения, и Вы знаете, что представление, таблица, сохранило proc, чтобы заполнить его от, создать функцию, подобную следующему коду c#:

public static void BindDataGridViewWhere(DataGridView dgv, string tablename, string selectList, string whereClause)
{
    Query qQuery = new Query(tablename);
    qQuery.SelectList = selectList;
    qQuery.WHERE(whereClause);
    DataSet dsDGV = qQuery.ExecuteDataSet();
    dgv.DataSource = dsDGV.Tables[0];
    dgv.RowHeadersVisible = false;
}

Затем на странице init или чем-то как этот, простой 1 вызов строки к этому методу, передающему datagridview в с, где оператор, что Вы хотите появиться и как в выборе, и whereclause и Вы связываетесь.

BindDataGridViewWhere (dgvCars, "tbl_Cars", "CarName", "Цвет, mdl как Модель", "Цвет = 'синий'");

Это работает отлично для любого объекта, что Вы делаете большую привязку с, такую как dropdownboxes, поля списков, datagridviews, что-либо еще. Затем для других, которые не соответствуют этой модели, имейте метод, который просто возвращает набор данных. Тот путь, если необходимо взаимодействовать с ним прежде, чем отобразить его, можно сделать дополнительную бизнес-логику и т.д.

Мне нравится этот подход, потому что, если Вы хотите переключить платформы данных, у Вас есть 1 место для внесения изменения. Можно создать экран очень быстро этот путь.

0
ответ дан 6 December 2019 в 10:54
поделиться

Я настоятельно рекомендовал бы SQLAlchemy, если для Вас возможно использовать среду Python.

Другая вещь, которую я попробовал, пишет мой собственный генератор схемы для тестирования наших систем на работе. Это было больше для генерации различных комбинаций запросов, чтобы попытаться разрушить систему. В основном я определил псевдо deparse дерево со словарями и списками

SQLAlchemy

Вот фрагмент кода

>>>for row in session.query(User, User.name).all():
...    print row.User, row.name
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password FROM users []
<User('ed','Ed Jones', 'f8s7ccs')> ed
<User('wendy','Wendy Williams', 'foobar')> wendy
<User('mary','Mary Contrary', 'xxg527')> mary
<User('fred','Fred Flinstone', 'blah')> fred
0
ответ дан 6 December 2019 в 10:54
поделиться

Используя встроенные функции.NET, такие как Столбцы Выражения (показанный пример VB) к привязке данных несколько столбцов, которые будут отображены сразу:

ds.Tables(0).Columns.Add(
    New DataColumn("CustomDescription", GetType(String), 
                   "LastName + ', ' + FirstName + ' - ' + 
                   WorkEmail"))
ResultsListBox.DataSource = ds
ResultsListBox.DataTextField = "CustomDescription"
ResultsListBox.DataValueField = "EmployeeID"
ResultsListBox.DataBind()
0
ответ дан 6 December 2019 в 10:54
поделиться

В SQL нет ничего плохого. Используйте правильный инструмент для правильной работы.

0
ответ дан 6 December 2019 в 10:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: