среда, 7 августа 2013 г.

Выборка в одну колонку

С чем только не приходится сталкиваться на работе.
Вот и с MSAccess встретился.
Суть: делаю джойн двух таблиц получается примерно следующее:
Col1| Col2
----+-----
1 | A
1 | B
1 | C
2 | D
2 | E
3 | F

Нужно получить вот такое:

Col1| Col2
----+-----
1 | A, B, C
2 | D, E
3 | F

В разных СУБД делается по разному. В Oracle есть функция wm_concat, в MSSQL это делается через xml.
А в MSAccess такого нет. Для этого используется (кто бы сомневался) Visual Basic.
Я поискал и нашел. Во первых оригинал.
Во вторых, как я использую эту функцию:

select accountid, 
       ConcatRelated("resource", 
                     "resources", 
                     "resourcetype in ('Телефонный номер') 
                      and accountid = " & [c.accountid]
                     ) as phoneslist
from customers c

Создается функция ConcatRelated, у нее 5 параметров:
1. Поле, которое вынимаем - "resource"
2. Таблица, из которой берем поле - "resources"
3. Любое условие WHERE, но если мы собираемся связывать таблицу с внешним запросом, то делается это так: "resourcetype in ('Телефонный номер') and accountid = " & [c.accountid], где с - таблица из внешнего запроса
4. Порядков сортировки (необязательно). Просто перечисляем поля, например "BeginDate, type"
5. Разделитель (необязательно). Если кому-то не нравится запятая и пробел, то можно использовать, например вот это "|"

А вообще много ответов на разные вопросы я нашел на этом сайте

четверг, 13 июня 2013 г.

Гениально!

Отпарсили CSV одним запросом.
Красота

И свой вариант (с оракловым синтаксисом):
Таблицы:
Attribs (name varchar2(20), value_list blob) с данными в поле value_list, разделенными символом ;
afl (id int) - вспомогательная, с последовательными числами в поле ID


SELECT A.Name,  
NullIf(SubStr(';'||to_char(value_list)||';', 
              afl.ID, 
              instr(';'||to_char(value_list)||';',
                    ';',
                    afl.ID) - afl.ID),
       '') AS Word
FROM afl, ATTRIBS A
WHERE afl.ID <= Length(';'||to_char(value_list)||';')
AND SubStr(';'||to_char(value_list)||';', afl.ID - 1, 1) = ';' 
AND instr( ';'||to_char(value_list)||';', ';',afl.ID) - afl.ID > 0

понедельник, 3 июня 2013 г.

Не поднимается сеть. CentOS

При старте network получаю ошибку "Error, some other host already uses address"
Сначала думал, что проблемы где-то на уровне DNS-DHCP, там все в порядке, адрес не занят, все чисто.
Посмотрел в таблице ARP - тоже ничего такого.
Но я был близко. А дело вот в чем: при запуске сети arping проверяет соответствие мака и IP-адреса.
Решение драконовское, но иного не нашел: открываем /etc/sysconfig/network-scripts/ifup-eth
Находим вот эти строки:

if ! /sbin/arping -q -c 2 -w 3 -D -I ${REALDEVICE} ${ipaddr[$idx]} ; then
  net_log $"Error, some other host already uses address ${ipaddr[$idx]}."
  exit 1
fi

И комментируем их.
Решение нашел здесь