Форум сетевых администраторов
Показаны 58 сообщений на этой странице

Форум сетевых администраторов (http://netadmin.ws/forum/index.php)
- MySQL (http://netadmin.ws/forum/forumdisplay.php?forumid=40)
-- Вопросы по MS SQL Server (http://netadmin.ws/forum/showthread.php?threadid=10996)


Помещено he][es 01-09-2005 в 12:44:

Вопросы по MS SQL Server

Покорнейше прошу простить, больше запостить некуда...
Столкнулся по великой нужде с этой какашечкой... Умная капец до невозможности!
(Боже как же мне нравится MYSQL!!)
Итак, вопрос первый: делаю банальный select (мало того что в этой тупости нет простого формата DATE...) так эта сволочь выдает результат в виде 17 дек 1985 0:00... Ð_Ð_Ð_Ð_... Вот кто просит этот дек писать?..
Соответственно вопрос: КАК мне получить дату в НОÐ_МАЛЬНОМ формате 1985-12-17???

he][es добавил 01-09-2005 в 12:59:35:
Есть такой запрос:

code:

INSERT INTO user_log (user_id, rec_date, rec_type, table_name, rec_id) VALUES ('1', NOW(), '2', 'contr_agenti','5')


Если его отослать напрямую из Ð_НÐ_, то ничего путного не выйдет...
При попытке отослать его из SQL Server Enterprise Managera он его переделывает в такой:

code:
INSERT INTO user_log (user_id, rec_date, rec_type, table_name, rec_id) VALUES ('1', { fn NOW() }, '2', 'contr_agenti', '3')


Соответственно вопрос, как написать запрос, что бы он проканал и для My и для MS??? (Использую PEAR :: DB)

__________________
Админ - вождь Апачей...


Помещено he][es 03-09-2005 в 09:17:

Господа! Неужели никто "этим" не пользуется?..

__________________
Админ - вождь Апачей...


Помещено Viktor 03-09-2005 в 13:45:

quote:
мало того что в этой тупости нет простого формата DATE.

Что ты понимаешь под тупостью мускул или сиквел?

В MS SQL Server есть 2 типа данных для даты SMALLDATETIME и DATETIME (на все случаи жизни)
quote:
Вот кто просит этот дек писать?..

А где он его тебе пишет?
Сама дата - это число (с целой частью и дробной)!
А то, что тебе пишется вид представления даты пользователю!

Создай rec_date не стринговое (полный утопизм), а типа даты.

__________________
Тест - проверка верности!


Помещено he][es 03-09-2005 в 13:55:

quote:
Что ты понимаешь под тупостью мускул или сиквел?

Ну в связи с тем, что в MySQL date есть, соответственно MS SQL...
quote:
В MS SQL Server есть 2 типа данных для даты SMALLDATETIME и DATETIME (на все случаи жизни)

Да я знаю... Мне это ...много... нужна ТОЛЬКО дата.
А выводит он это дело в Ð_НÐ_ скрипте, по выборке из БД...
quote:
А то, что тебе пишется вид представления даты пользователю!

Ð_х как бы мне его изменить?.. И "принимает" он дату "коряво"... Я ему даю YYYY-MM-DD а он считает, что это YYYY-DD-MM...
И как мне с "этим" ужиться... Желательно "унифицировать" запросы и для MS и для My...

__________________
Админ - вождь Апачей...


Помещено Viktor 05-09-2005 в 09:15:

quote:
Ð_х как бы мне его изменить?.. И "принимает" он дату "коряво"... Я ему даю YYYY-MM-DD а он считает, что это YYYY-DD-MM...

Смотри локализацию на SQL Server и ОDBC.

__________________
Тест - проверка верности!


Помещено he][es 05-09-2005 в 12:28:

А где её смотреть?..

__________________
Админ - вождь Апачей...


Помещено Viktor 05-09-2005 в 12:42:

quote:
А где её смотреть?..

Локализация сервера задается при установке .
Локализация источника ODBC в Администраторе ODBC в настойках самого источника.

__________________
Тест - проверка верности!


Помещено he][es 05-09-2005 в 21:24:

quote:
Локализация сервера задается при установке

и не меняется?.. Капец... В очередной раз поражаюсь Мелкомягким...
quote:
Локализация источника ODBC в Администраторе ODBC в настойках самого источника

Чё то не нашёл... Поищу ещё...

__________________
Админ - вождь Апачей...


Помещено he][es 06-09-2005 в 03:20:

А ешё, 2 вопроса:
а) о целесообразности хранения .doc файлов в БД и
б) как их туда засунуть?..
в MySQL легко суется так:

PHP:


$dogovor 
= array();

$file_name = $_FILES['userfile']['tmp_name'];
$handle = fopen($file_name, "r");
$dogovor['text_dogovora'] = fread($handle, $_FILES['userfile']['size']);
fclose($handle);
                        
$dogovor['add_date'] = date('Y-m-d');
$dogovor['seller'] = $var_list['seller'];
$dogovor['buyer'] = $var_list['buyer'];
$dogovor['predmet_dogovora'] = $var_list['predmet_dogovora'];
$dogovor['total_price'] = $var_list['total_price'];
$dogovor['start_date'] = $var_list['start_date'];
$dogovor['end_date'] = $var_list['end_date'];
$dogovor['activity'] = 1;

if (
$config['type_SQL'] == 'mssql') {
    
$result = $db->query('set dateformat Ymd');
    if (
DB::isError($result)) {
        die (
$result->getMessage());
    }
}
$result = $db->autoExecute('osnovania', $dogovor, DB_AUTOQUERY_INSERT);


MS спотыкается и выдает синтаксическую (кажется) ошибку...

he][es добавил 06-09-2005 в 03:46:52:
Ð_х... почитал, подумал, нафиг БД, буду на винте хранить файло...

__________________
Админ - вождь Апачей...


Помещено Viktor 06-09-2005 в 11:21:

quote:
а) о целесообразности хранения .doc файлов в БД и
б) как их туда засунуть?..

а) все зависит от задачи...
б) для хранения больших объемов (DOC бывает и большой) бинарных (DOC хранит не только текст) данных переменной длины используется тип данных IMAGE.

__________________
Тест - проверка верности!


Помещено he][es 06-09-2005 в 12:07:

Viktor и ещё по поводу типов данных, можно где нить нормально почитать?..
(Блин! Ну засада! Я НИКАК не могу понять, как ему сказать, что мне дату надо вид YYYY-MM-DD!!! )

__________________
Админ - вождь Апачей...


Помещено Viktor 06-09-2005 в 12:52:

quote:
мне дату надо вид YYYY-MM-DD!!!

В этом виде нужно сохранить в БД или отобразить значение из БД?

__________________
Тест - проверка верности!


Помещено he][es 06-09-2005 в 21:37:

Итак! 1/2 решения найдено:

code:

; Specify how datetime and datetim4 columns are returned
; On => Returns data converted to SQL server settings
; Off => Returns values as YYYY-MM-DD hh:mm:ss
mssql.datetimeconvert = Off


Имеем: YYYY-MM-DD hh:mm:ss... Ð_то хорошо, хоть запросы унифицировали. Теперь режем в Ð_НÐ_ первый 10символов и получаем что хотели... Нда... Изврат конечно, но вроде больше никак.
По поводу импорта я писал выше... 1ый пост. посмотрите плз...
Удобнее было бы конечно NOW() использовать, но если нельзя придётся делать как я написал в зацитированом выше куске кода...

__________________
Админ - вождь Апачей...


Помещено Viktor 07-09-2005 в 11:30:

Для получения даты и конвертации ее в YYYY-MM-DD используй
CONVERT(char(10), GETDATE(), 20)

__________________
Тест - проверка верности!


Помещено he][es 07-09-2005 в 12:49:

Viktor этот запрос не проканает под MySQL (а хочется одинаковые... кроссплатформенные...)

__________________
Админ - вождь Апачей...


Помещено Viktor 07-09-2005 в 13:30:

Ну это вряд ли...

__________________
Тест - проверка верности!


Помещено he][es 19-09-2005 в 17:11:

Ещё один "затык" появился. Транзакции.
Сказали что они работают исключительно в одном "скрипте", те. даже не в одном соединении, а ещё уже... Т.е. Если я хочу соединиться с БД, начать транзакцию, послать несколько запросов, а потом отменить или подтвердить транзакцию, то этого сделать нельзя?.. (Ð_НÐ_)

__________________
Админ - вождь Апачей...


Помещено Viktor 20-09-2005 в 11:17:

quote:
Сказали что они работают исключительно в одном "скрипте", те. даже не в одном соединении, а ещё уже...

Брешут гады!

Не знаю как в ПХП, а в АСП все чудненько работает.

При создании сессии создаешь подключение к БД и сохраняешь его в переменной сессии.
В каждом скрипте используешь в качестве сушествующего соединения соединение из переменной сессии.
Для начала транзакции в ADO-соединении используется метод BeginTrans, для завершения CommitTrans, а для отмены RollbackTrans.

__________________
Тест - проверка верности!


Помещено he][es 20-09-2005 в 11:38:

Во блин :/ Я так и делаю. При начале раб-ты скрипта создаю соединение, делаю кое какие выборки, потом говорю:
SET IMPLICIT_TRANSACTIONS ON; BEGIN TRANSACTION add_rashod;
набор запросов на вставку, выборку и т.п.
затем в Ð_НÐ_ говорю если чего то не так, то говори:
ROLLBACK TRANSACTION add_rashod;
Он говорит, а сервак ему огрызается:
nativecode=6401 - Cannot roll back add_rashod. No transaction or savepoint of that name was found.

Воот... И я чё то в непонятках.... Как быть?.. Куда копать?..

__________________
Админ - вождь Апачей...


Помещено Viktor 20-09-2005 в 13:22:

quote:
При начале раб-ты скрипта создаю соединение

И естественно при завершении скрипта соединение закрывается.

Я создаю его при начале сессии, в рез-те оно хранится на протяжении всей сессии до ее закрытия и может использоваться при выполнении различных скриптов.

Ты используешь начало транзакции на стороне сервера (пересылка запросов серверу в чистом виде) я же использовал начало транзакции используя само соединение. И пока оно открыто транзакция продолжается.
quote:
Cannot roll back add_rashod. No transaction or savepoint of that name was found

Возможно при завершении скрипта и автоматическом закрытии соединения транзакция закрылась автоматически и попытка отмены завершившейся транзакции и вызывает ошибку.

__________________
Тест - проверка верности!


Помещено he][es 20-09-2005 в 14:40:

quote:
И естественно при завершении скрипта соединение закрывается.

Дык оно мне и не нужно более...
К примеру мне нужно вставить в одну табл. одну строку и в др. табл. неск. строк связанных с первой, но мне не нужно что бы они "отдельно" вставлялись, что бы при неудаче с одной из строк, в любой таблице, все откатились. Вставляю я их в момент работы скрипта.

PHP:

if ($config['type_SQL'] == 'mssql') {
    
$result = $db->query('set dateformat Ymd');
    if (
DB::isError($result)) {
        die (
$result->getMessage());
    }
    
$result = $db->query('SET IMPLICIT_TRANSACTIONS ON; BEGIN TRANSACTION add_rashod;'); //SET AUTOCOMMIT=0; 
    
if (DB::isError($result)) { print 'trans beg err';
        die (
$result->getMessage());
    } else {
        print 
'trans beg ok ';
    }
} elseif (
$config['type_SQL'] == 'mysql') {
    
$result = $db->query('SET AUTOCOMMIT=0; START TRANSACTION;');
    if (
DB::isError($result)) {
        die (
$result->getMessage());
    }
}

    
// Здесь у меня куча всяких запросов выборок вставок...

if($count_ok == count($result_array['rashodi']) && $kol_vo == 1) {
    
$result = $db->query('COMMIT TRANSACTION add_rashod;');
    if (
DB::isError($result)) { print 'commit';
        die (
$result->getMessage());
    } else {
        
$parser->site_body .= '<h1>Commit</h1>';
    }
} else {
    
$result = $db->query('ROLLBACK TRANSACTION add_rashod;');
    if (
DB::isError($result)) { print 'rollback<pre>'; print_r($result);
        die (
$result->getMessage());
    } else {
        
$parser->site_body .= '<h1>ROLLBACK</h1>';
    }
}


Вот в чём весь затык то! Я бы понял если соединение прерывалось...
(кстати можно как нить посм. "номер" соединения текущего или что то на подобе SIDа, что бы при старте транзакции сравнить его с тем, что при конце?)

__________________
Админ - вождь Апачей...


Помещено Viktor 21-09-2005 в 13:09:

Я понял из твоих предыдущих сообщений, что тебе нужна транзакция в пределах сессии с вызовом различных ПХП скриптов (юзер работает с несколькими веб-страницами).

К последнему посту. Попробуй транзакцию без имени.

quote:
(кстати можно как нить посм. "номер" соединения текущего или что то на подобе SIDа, что бы при старте транзакции сравнить его с тем, что при конце?)

Для просмотра вложенности выполняемых транзакций можно использовать серверную переменную @@TRANCOUNT

Например, так
select @@TRANCOUNT

Для просмотра SIDа можно использовать запросы к системным таблицам или программу SQLView32.

__________________
Тест - проверка верности!


Помещено he][es 22-09-2005 в 10:26:

Вообшем наз0ся ЧАЩЕ ОБНОВЛЯЙТЕ МАНЫ!.. Проблему решил слив новый ман по PEAR:: DB...
Теперь такой вопрос, нужно сделать "temporary table" к примеру на час... Такое реально? Или только в пределах соединения?..

__________________
Админ - вождь Апачей...


Помещено Viktor 22-09-2005 в 10:43:

quote:
Такое реально? Или только в пределах соединения?..

Оригинальный текст из хелпа...

Temporary Tables
You can create local and global temporary tables. Local temporary tables are visible only in the current session; global temporary tables are visible to all sessions.

Prefix local temporary table names with single number sign (#table_name), and prefix global temporary table names with a double number sign (##table_name).

SQL statements reference the temporary table using the value specified for table_name in the CREATE TABLE statement:

CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)
INSERT INTO #MyTempTable VALUES (1)

If a local temporary table is created in a stored procedure or application that can be executed at the same time by several users, SQL Server has to be able to distinguish the tables created by the different users. SQL Server does this by internally appending a numeric suffix to each local temporary table name. The full name of a temporary table as stored in the sysobjects table in tempdb consists of table name specified in the CREATE TABLE statement and the system-generated numeric suffix. To allow for the suffix, table_name specified for a local temporary name cannot exceed 116 characters.

Temporary tables are automatically dropped when they go out of scope, unless explicitly dropped using DROP TABLE:

* A local temporary table created in a stored procedure is dropped automatically when the stored procedure completes. The table can be referenced by any nested stored procedures executed by the stored procedure that created the table. The table cannot be referenced by the process which called the stored procedure that created the table.


* All other local temporary tables are dropped automatically at the end of the current session.


* Global temporary tables are automatically dropped when the session that created the table ends and all other tasks have stopped referencing them. The association between a task and a table is maintained only for the life of a single Transact-SQL statement. This means that a global temporary table is dropped at the completion of the last Transact-SQL statement that was actively referencing the table when the creating session ended.

__________________
Тест - проверка верности!


Помещено he][es 12-12-2005 в 03:14:

Возникла проблема с типами: необходимо числовое поле в 20 цифр, biging 19 (кажется) да ещё и не полных. Что делать? Юзать text?

__________________
Админ - вождь Апачей...


Помещено Viktor 12-12-2005 в 09:48:

Если тебе нужны 20 цифр, да еще и с начальными нулями, то однозначно CHAR(20).

__________________
Тест - проверка верности!


Помещено he][es 12-12-2005 в 13:56:

Viktor дык это же не числовой формат... :/
Др. варианта нет?

__________________
Админ - вождь Апачей...


Помещено Viktor 14-12-2005 в 09:11:

Меня смутило твое

quote:
да ещё и не полных.

Я понял, что у тебя есть ведущие нули в числе.

Если их нет, то юзай DECIMAL [(p [, s])] или NUMERIC[(p [, s] )]

Типы DECIMAL и NUMERIC, в отличие от FLOAT и REAL, позволяют сохранять десятичные числа точно, без искажений. Допустимый интервал значений и точность определяются с помощью параметров р и s. Вы можете сохранять значения в интервале от (-10Е-38) до (+10Е+38) и использовать для этого от 2 до 17 байт.
Параметр р определяет точность, с которой можно сохранить десятичное число (т.е. р — это общее количество сохраняемых цифр, макс - 38). А параметр s определяет количество сохраняемых Цифр справа от десятичной точки (s должно быть меньше или равно р). Если опустить параметры р и s, то им будут присвоены стандартные значения (р=18, s=0).

В твоем случае DECIMAL (20).

__________________
Тест - проверка верности!


Помещено polo 14-12-2005 в 16:31:

а вообще для лучшей совместимости всегда хранят дату в unixtimestampe. Никогда не любил пользоваться бд функциями по работу с датами.

__________________
Всегда есть решение.


Помещено he][es 20-12-2005 в 16:18:

Viktor пасиба. Понял.
polo учту на будущее...

__________________
Админ - вождь Апачей...


Помещено he][es 05-01-2006 в 14:05:

Новый вопрос: хачу "LIMIT 12" (ну или LIMIT 1,12) в MS!!!! Или я нифига в этой доке не пойму, или у него нету LIMIT...

__________________
Админ - вождь Апачей...


Помещено Viktor 09-01-2006 в 11:47:

Если можно, то подробней про

quote:
хачу "LIMIT 12"

__________________
Тест - проверка верности!


Помещено he][es 09-01-2006 в 12:23:

Ну в MySQL пишешь
SELECT * FROM table LIMIT 1, 12;
и он выберает только первые 12 строк запроса...

__________________
Админ - вождь Апачей...


Помещено Viktor 09-01-2006 в 12:29:

В SQL Server
SELECT TOP 12 * FROM table

__________________
Тест - проверка верности!


Помещено he][es 09-01-2006 в 13:10:

Viktor из за моей фанатичной упертости в кроссплатформенность данный запрос не проканывает ... MySQL его не переварит.

__________________
Админ - вождь Апачей...


Помещено Viktor 09-01-2006 в 13:18:

Других вариантов нет...

__________________
Тест - проверка верности!


Помещено he][es 09-01-2006 в 14:02:

:/ жаль... Ладно, прорвемся...
Ещё один вопрос: есть запрос:

code:

SELECT     limits.id, limits.structura_kks_id, limits.structura_rashodov_id, limits.to_year, limits.to_year_total, structura_kks.title AS structura_kks_title, 
                      structura_rashodov.title AS structura_rashodov_title,
                          (SELECT     SUM(total_price_nds)
                            FROM          rashodi INNER JOIN
                                                   structura_kks structura_kks_inner ON rashodi.structura_kks_id = structura_kks_inner.id
                            WHERE      structura_kks_inner.cleft >= structura_kks.cleft AND structura_kks_inner.cright <= structura_kks.cright) AS rashodi_total
FROM         limits INNER JOIN
                      structura_kks ON limits.structura_kks_id = structura_kks.id INNER JOIN
                      structura_rashodov ON limits.structura_rashodov_id = structura_rashodov.id
WHERE     (limits.to_year_total >=
                          (SELECT     SUM(total_price_nds)
                            FROM          rashodi INNER JOIN
                                                   structura_kks structura_kks_inner ON rashodi.structura_kks_id = structura_kks_inner.id
                            WHERE      structura_kks_inner.cleft >= structura_kks.cleft AND structura_kks_inner.cright <= structura_kks.cright))
ORDER BY structura_kks.cleft, structura_rashodov.cleft


Хотелось бы вместо 2ого "вложенного" запроса написать что то типа:

code:
SELECT     limits.id, limits.structura_kks_id, limits.structura_rashodov_id, limits.to_year, limits.to_year_total, structura_kks.title AS structura_kks_title, 
                      structura_rashodov.title AS structura_rashodov_title,
                          (SELECT     SUM(total_price_nds)
                            FROM          rashodi INNER JOIN
                                                   structura_kks structura_kks_inner ON rashodi.structura_kks_id = structura_kks_inner.id
                            WHERE      structura_kks_inner.cleft >= structura_kks.cleft AND structura_kks_inner.cright <= structura_kks.cright) AS rashodi_total
FROM         limits INNER JOIN
                      structura_kks ON limits.structura_kks_id = structura_kks.id INNER JOIN
                      structura_rashodov ON limits.structura_rashodov_id = structura_rashodov.id
WHERE     (limits.to_year_total >= rashodi_total)
ORDER BY structura_kks.cleft, structura_rashodov.cleft


Ан нет, выдает ошибку... Что то с этим можно подклать?

__________________
Админ - вождь Апачей...


Помещено Viktor 10-01-2006 в 11:59:

Вполне логично, т.к. нельзя использовать в условиях имена вычисляемых столбцов.

А что мешает сделать вид, который делает необходимые вычисления?

Вид MyView

code:

SELECT     SUM(total_price_nds) AS rashodi_total
                            FROM          rashodi INNER JOIN
                                                   structura_kks structura_kks_inner ON rashodi.structura_kks_id = structura_kks_inner.id
                            WHERE      structura_kks_inner.cleft >= structura_kks.cleft AND structura_kks_inner.cright <= structura_kks.cright



Запрос (Выражение FROM нужно подправить )

code:
SELECT     limits.id, limits.structura_kks_id, limits.structura_rashodov_id, limits.to_year, limits.to_year_total, structura_kks.title AS structura_kks_title, 
                      structura_rashodov.title AS structura_rashodov_title,
                          MyView.rashodi_total 
FROM      MyView,    limits INNER JOIN
                      structura_kks ON limits.structura_kks_id = structura_kks.id INNER JOIN
                      structura_rashodov ON limits.structura_rashodov_id = structura_rashodov.id

WHERE     (limits.to_year_total >= MyView.rashodi_total)
ORDER BY structura_kks.cleft, structura_rashodov.cleft




+ виды теоретически выполняются быстрее, чем обычные запросы.

__________________
Тест - проверка верности!


Помещено he][es 10-01-2006 в 12:53:

Viktor "вид"="представление"? (я такой термин слышал).
А он возьмёт значения для WHERE "извне"?..
И опять встает вопрос о моей фанатичной упертости в кроссплатформенность... Будет ли это под MySQL 5.x работать?..

__________________
Админ - вождь Апачей...


Помещено polo 10-01-2006 в 14:11:

quote:
SELECT TOP 12 * FROM table

Imho: А не лучше ли сделать функцию для выборки таких результатов, которая бы принимала три параметра, строку запроса, limitmin, limitmax а потом запарсить строку запроса и добавить в нее то что нужно.

__________________
Всегда есть решение.


Помещено he][es 10-01-2006 в 15:57:

polo пасиба за идею... Видимо придтся так и сделать...
Вот ещё одна фишка:

code:

SELECT     structura_kks.id, structura_kks.title, structura_kks. LEVEL, structura_kks.cleft, structura_kks.cright, structura_kks.fio, 
                      contr_zadania.id AS contr_zadania_id, contr_zadania.kz_to_year AS year_of_kz, contr_zadania.kz_year AS to_year, 
                      contr_zadania.kz_I_kvartal AS kv_1, contr_zadania.kz_II_kvartal AS kv_2, contr_zadania.kz_III_kvartal AS kv_3, 
                      contr_zadania.kz_IV_kvartal AS kv_4
FROM         structura_kks LEFT OUTER JOIN
                      contr_zadania ON contr_zadania.structura_kks_id = structura_kks.id
ORDER BY structura_kks.cleft


Вроде всё что надо, НО он не совсем то что нужно делает, а если написать

code:
SELECT     structura_kks.id, structura_kks.title, structura_kks. LEVEL, structura_kks.cleft, structura_kks.cright, structura_kks.fio, 
                      contr_zadania.id AS contr_zadania_id, contr_zadania.kz_to_year AS year_of_kz, contr_zadania.kz_year AS to_year, 
                      contr_zadania.kz_I_kvartal AS kv_1, contr_zadania.kz_II_kvartal AS kv_2, contr_zadania.kz_III_kvartal AS kv_3, 
                      contr_zadania.kz_IV_kvartal AS kv_4
FROM         structura_kks LEFT OUTER JOIN
                      contr_zadania ON contr_zadania.structura_kks_id = structura_kks.id
WHERE contr_zadania.kz_to_year = '2006'
ORDER BY structura_kks.cleft


то он выбирает не все записи из таблицы structura_kks, а только те, к которым есть привязка из contr_zadania...
Требуется выбрать все из structura_kks, и привязать к ним имеющиеся в contr_zadania строки, НО с условием, что они contr_zadania.kz_to_year = '2006'... Как это лучше сделать?

__________________
Админ - вождь Апачей...


Помещено polo 10-01-2006 в 16:00:

he][es, если не секрет, зачем ты делаешь поддержку двум базам одновременно?

__________________
Всегда есть решение.


Помещено he][es 11-01-2006 в 06:06:

polo эээ... ну.. "типа круто" ... Просто когда есть возможность перенести приложение на др. БД это же хорошо.. Или я не прав?

__________________
Админ - вождь Апачей...


Помещено polo 11-01-2006 в 12:41:

Ну смотря какое приложение и на что оно направлено. Если это какой-то коммерческий прект расчитанный на узкий круг клиентов, то таке врядли нужно. Если это крупномасштабный скрипт который будет продаваться или раздаваться публично, то наверное нужно. Я например думаю так: если пишишь скрипт, максимально его подготовь для перехода на другую бд, а при надобности позже переноситься на другую бд. Хочу заметить что это лично мое мнение.

__________________
Всегда есть решение.


Помещено he][es 11-01-2006 в 17:30:

quote:
Если это какой-то коммерческий прект расчитанный на узкий круг клиентов, то таке врядли нужно.

Вот сейчас основой является MS SQL 2000. Который как бы не бесплатен... А если кто то очень правильный и не хочет его юзать?..
С др. стороны я прекрасно понимаю, что 99% что его никто кроме орг.ии для которой я его делаю использовать не будет... НО... я болен манией кросплатформенности...

__________________
Админ - вождь Апачей...


Помещено Viktor 13-01-2006 в 10:15:

quote:
"вид"="представление"?

Да.
quote:
А не лучше ли сделать функцию для выборки таких результатов

и

А он возьмёт значения для WHERE "извне"?..



В этом случае нужно использовать хранимую процедуру.
(тот же вид, но с параметром )
quote:
он выбирает не все записи из таблицы structura_kks, а только те, к которым есть привязка из contr_zadania

Логично, т.к. поля записей, которые не привязаны содержат NULL.

Используй в условии отбора

code:
WHERE contr_zadania.kz_to_year = '2006' 
OR contr_zadania.kz_to_year IS NULL

__________________
Тест - проверка верности!


Помещено he][es 24-01-2006 в 15:51:

Viktor не... нифига не работает!..
Может плохо объяснил:
Таблица structura_kks это список подразделений
Таблица contr_zadania содержит задания для стр. подразделений привязанные по id. НО не для всех подразделений установлены задания, а так же для одного стр. подразделения могут быть установлены задания на несколько лет! Надо выбрать все стр. подразделения и задания на один год...

__________________
Админ - вождь Апачей...


Помещено Viktor 25-01-2006 в 11:35:

У меня работало...

Как вариант, кинь нужные таблицы потестить.

__________________
Тест - проверка верности!


Помещено he][es 25-01-2006 в 12:34:

В приложении 2 табл.
Про требуемую выборку я написал чуть выше...
Заранее благодарен за помощь!!!

he][es добавил 25-01-2006 в 12:46:50:
Ваабще ничего не могу понять, выбирается, и вроде бы даже то что надо, НО почему то из табл. structura_kks выводятся не все строки!
Не выводятся те строки для которых указаны контр.задания (табл. contr_zadania) на прошлый (к примеру) год. Т.е. те где не contr_zadania.kz_to_year = '2006'

__________________
Админ - вождь Апачей...


Помещено Viktor 25-01-2006 в 18:55:

Все чудненько работает

code:

SELECT     structura_kks.id, structura_kks.title, structura_kks. LEVEL, structura_kks.cleft, structura_kks.cright, structura_kks.fio, 
                      contr_zadania.id AS contr_zadania_id, contr_zadania.kz_to_year AS year_of_kz, contr_zadania.kz_year AS to_year, 
                      contr_zadania.kz_I_kvartal AS kv_1, contr_zadania.kz_II_kvartal AS kv_2, contr_zadania.kz_III_kvartal AS kv_3, 
                      contr_zadania.kz_IV_kvartal AS kv_4
FROM         structura_kks LEFT OUTER JOIN
                      contr_zadania ON contr_zadania.structura_kks_id = structura_kks.id
WHERE contr_zadania.kz_year = '2006' OR contr_zadania.kz_year IS NULL
ORDER BY structura_kks.cleft



Проблема была в том, что ты условие ставил не по тому полю.
Ты использовал contr_zadania.kz_to_year, а нужно contr_zadania.kz_year.

В том у тебя цифры явно к году не относящиеся (например 15000)

Для безошибочности и лучшего понятия условия сервером можно условие записать так

code:
WHERE (contr_zadania.kz_year = '2006') OR (contr_zadania.kz_year IS NULL)

__________________
Тест - проверка верности!


Помещено he][es 25-01-2006 в 21:13:

Viktor я прошу прощения за некую дезинформацию, но у меня тут поля просто попереименовались... Т.что я всё правильно писал...
При таком запросе выводятся не все записи из таблицы structura_kks, НЕ выводятся те для которых установлены задания (табл. contr_zadania) не удовлетвор. условию... Т.е. в данном случае строки 1 и 2. (там в таблицах для них есть задания на 2005 год)...

__________________
Админ - вождь Апачей...


Помещено Viktor 28-01-2006 в 13:08:

quote:
НЕ выводятся те для которых установлены задания (табл. contr_zadania) не удовлетвор. условию...

Ну так и не надо ставить условие = 2006 если нужны данные и за другие годы.

__________________
Тест - проверка верности!


Помещено he][es 28-01-2006 в 18:31:

Viktor вы меня не правильно поняли...
К примеру для записи №4 в таблице structura_kks установлено задание (табл. contr_zadania) на 2005 год, и при запросе с условием = 2006, строка №4 из structura_kks ВООБЩЕ не выведется...
А мне нужно что бы если для 4ой строки небыло подходящего задания (=2006) то выводилась инф-ия из structura_kks.
Те.
structura_kks
1 - запись1
2 - запись2
3 - запись3
4 - запись4
contr_zadania
1 - 2 - 2006 - 20000
2 - 3 - 2006 - 34445
3 - 1 - 2005 - 56784

При таком раскладе после запроса мы получим
запись2 - 20000
запись3 - 34445
запись4 - null
А первой записи НЕТ... Теперь понятно?

__________________
Админ - вождь Апачей...


Помещено Viktor 02-02-2006 в 09:43:

Если я правильно понял, то значения из contr_zadania должны быть только для 2006 года, а для остальных записей из structura_kks Null?

Если так, то вот вариант


code:

SELECT     structura_kks.id, structura_kks.title, structura_kks. LEVEL, structura_kks.cleft, structura_kks.cright, structura_kks.fio, 
                      c.id AS contr_zadania_id, c.kz_to_year AS year_of_kz, c.kz_year AS to_year, 
                      c.kz_I_kvartal AS kv_1, c.kz_II_kvartal AS kv_2, c.kz_III_kvartal AS kv_3, 
                      c.kz_IV_kvartal AS kv_4
FROM         structura_kks LEFT OUTER JOIN (select * from contr_zadania where kz_year = '2006') c 
	ON c.structura_kks_id = structura_kks.id
ORDER BY structura_kks.cleft



Вложенный запрос выбирает данные из contr_zadania за нужный год, а потом объединяет их с structura_kks.
Выводятся все записи и где не 2006 - Null.

__________________
Тест - проверка верности!


Помещено he][es 30-03-2006 в 11:05:

И снова здравствуйте
Такой казалось бы простой запрос, а не работает...
Таблица1:
id, type, price
Таблица2:
id, title

надо первую сгруппировать по type посчитать SUM(price) и проименовать эти группы из Табл.2... (как вы догадались id Т.2 это те самые type из Т.1)

Делаю:

SELECT structura_dohodov.id, SUM(dohodi.total_price_nds) AS dohodi_total FROM dohodi INNER JOIN structura_dohodov ON (dohodi.structura_dohodov_id = structura_dohodov.id) WHERE (dohodi.structura_kks_id = 4) AND (YEAR(dohodi.data_dohoda) = '2006') GROUP BY structura_dohodov.id

И всё казалось бы хорошо и счастье близко, но если я вставлю structura_dohodov.title он грязно выругается на то что его нет в гроуп, а туда его ставить нельзя т.к. оно типа text...

Вот такой затык. Что делать?

he][es добавил 30-03-2006 в 11:14:02:
З.Ы. GROUP BY dohodi.structura_dohodov_id тоже не проканывает...

__________________
Админ - вождь Апачей...


Помещено Viktor 30-03-2006 в 11:41:

quote:
а туда его ставить нельзя т.к. оно типа text...

Логично.
Поля типа ТЕХТ (для хранения БОЛЬШИХ текстовых данных (до 2 Гб)) в группировке использовать нельзя.

Замени тип данных на VARCHAR(n), где n - до 8000 символов.
quote:
GROUP BY dohodi.structura_dohodov_id тоже не проканывает...

Тоже логично...
Если в сроке запроса до агрегатной функции (SUM()) стоит
SELECT structura_dohodov.id,
то и в группировке должно быть structura_dohodov.id!!!


Если менять тип данных в падло или нельзя, то создай вид (представление) на основе своего запроса

SELECT structura_dohodov.id, SUM(dohodi.total_price_nds) AS dohodi_total FROM dohodi INNER JOIN structura_dohodov ON (dohodi.structura_dohodov_id = structura_dohodov.id) WHERE (dohodi.structura_kks_id = 4) AND (YEAR(dohodi.data_dohoda) = '2006') GROUP BY structura_dohodov.id

А потом сделай новый запрос, выбирающий данные из вида и structura_dohodov.title

__________________
Тест - проверка верности!


Помещено he][es 30-03-2006 в 13:08:

Иначе никак?... :/ ладно... поменяю тип =)
(я всё парюсь с типами данных... Нигде чётко не могу найти описаний..)

__________________
Админ - вождь Апачей...


Помещено Viktor 30-03-2006 в 15:12:

quote:
Нигде чётко не могу найти описаний

Так я ж тебе выкладывал в эту тему!

__________________
Тест - проверка верности!


Формат времени GMT. Текущее время 22:59.
Показаны 58 сообщений на этой странице

Powered by: vBulletin Version 2.2.4
Copyright © Jelsoft Enterprises Limited 2000, 2001.