Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 ошибка в скрипте  [new]
SDA_H
Member

Откуда:
Сообщений: 283
Прмогите оптимизировать скрипт!!!
Есть исходный скрипт
/*SELECT Distinct 
o.PR_KEY, o.ORG_NAME, o.Rang 
,Zayv=(Select Count(PR_KEY) From Primary_Request Where Org_key=o.PR_KEY) 
,Vstr=(Select Count(PR_KEY) From ORG_Information Where Type_Cont=8 AND Org_key=o.PR_KEY) 
FROM Organizations o 
LEFT JOIN Org_Information I on I.ORG_KEY = O.PR_KEY 
LEFT JOIN Managers m ON m.ORG_ID = o.PR_KEY
LEFT JOIN Primary_Request P on P.ORG_KEY = O.PR_KEY 
WHERE (o.OTM=0)  AND (m.Dismissed=1) AND (m.Person_ID=212)
 AND I.Data>= '30.04.2011' AND I.Data<='20.10.2011' order by org_name
--116 records 6sec
*/


попробовал переписать
SELECT Distinct 
o.PR_KEY, o.ORG_NAME, o.Rang ,Count(P.PR_KEY)Zayv
,Vstr=(Select Count(PR_KEY) From ORG_Information Where Type_Cont=8 AND Org_key=o.PR_KEY)
FROM Organizations o 
LEFT JOIN Org_Information I on I.ORG_KEY = O.PR_KEY 
LEFT JOIN Managers m ON m.ORG_ID = o.PR_KEY
LEFT JOIN Primary_Request P on P.ORG_KEY = O.PR_KEY 
group by o.PR_KEY, o.ORG_NAME, o.Rang, o.OTM , m.Dismissed, m.Person_ID, I.Data, I.Type_Cont
having (o.OTM=0)  AND 

Где тут ошибка???????
20 окт 11, 18:09    [11474869]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в скрипте  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
SDA_H
Где тут ошибка???????


Студия показывает номер строки с ошибкой (вместе с текстом). А двойной клик по ней приведет к переходу на эту строку.
20 окт 11, 18:14    [11474889]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в скрипте  [new]
SDA_H
Member

Откуда:
Сообщений: 283
тмеется в виду логическая ошибка
20 окт 11, 18:18    [11474912]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в скрипте  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
SDA_H,

Вы хотите, чтоб Вам по неработающему скрипту угадали его логику и сделали его работающим? Так не бывает... Начнем с того, что он у Вас даже синтаксически неверен.
20 окт 11, 18:19    [11474921]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в скрипте  [new]
Glory
Member

Откуда:
Сообщений: 104751
SDA_H
тмеется в виду логическая ошибка

Это передача Что?Где?Когда? и нужно угадать, что в черном ящике ?
20 окт 11, 18:21    [11474934]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в скрипте  [new]
SDA_H
Member

Откуда:
Сообщений: 283
пардон
было:
/*SELECT Distinct 
o.PR_KEY, o.ORG_NAME, o.Rang 
/*1*/,Zayv=(Select Count(PR_KEY) From Primary_Request Where Org_key=o.PR_KEY) 
,Vstr=(Select Count(PR_KEY) From ORG_Information Where Type_Cont=8 AND Org_key=o.PR_KEY) 
FROM Organizations o 
LEFT JOIN Org_Information I on I.ORG_KEY = O.PR_KEY 
LEFT JOIN Managers m ON m.ORG_ID = o.PR_KEY
LEFT JOIN Primary_Request P on P.ORG_KEY = O.PR_KEY 
WHERE (o.OTM=0)  AND (m.Dismissed=1) AND (m.Person_ID=212)
 AND I.Data>= '30.04.2011' AND I.Data<='20.10.2011' order by org_name
--116 records 6sec
*/
Нужно заменить строчку [1] - не используя подзапрос Select Count(PR_KEY) From Primary_Request Where Org_key=o.PR_KEY
попробовал сделать так
SELECT Distinct 
o.PR_KEY, o.ORG_NAME, o.Rang ,Count(*)Zayv
,Vstr=(Select Count(PR_KEY) From ORG_Information Where Type_Cont=8 AND Org_key=o.PR_KEY)
FROM Organizations o 
LEFT JOIN Org_Information I on I.ORG_KEY = O.PR_KEY 
LEFT JOIN Managers m ON m.ORG_ID = o.PR_KEY
LEFT JOIN Primary_Request P on P.ORG_KEY = O.PR_KEY 
where I.Data>= '30.04.2011' AND I.Data<='20.10.2011' 
group by o.PR_KEY,p.Org_key, o.ORG_NAME, o.Rang, o.OTM , m.Dismissed, m.Person_ID, I.Data, I.Type_Cont
having (o.OTM=0)  AND (m.Dismissed=1) AND (m.Person_ID=212)
order by org_name
сказали что логически невнрно. где?
20 окт 11, 18:33    [11474998]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в скрипте  [new]
Glory
Member

Откуда:
Сообщений: 104751
SDA_H
Нужно заменить строчку [1] -

Нужно прочитать https://www.sql.ru/forum/actualthread.aspx?tid=127456
20 окт 11, 18:33    [11475002]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в скрипте  [new]
_anybody
Guest
SDA_H
сказали что логически невнрно. где?
+ Ну вот было (я просто переносы расставил):

Хотя я лично не понимаю почему:
  • Org_Information и Managers соединяются по LEFT JOIN, хотя благодаря условиям в WHERE это все-равно будет INNER JOIN;
  • зачем вообще нужно LEFT JOIN Primary_Request... - благодаря Distinct эффект = 0.
    SELECT Distinct 
      o.PR_KEY,
      o.ORG_NAME,
      o.Rang,
      Zayv=(Select Count(PR_KEY) From Primary_Request Where Org_key=o.PR_KEY), /*1*/
      Vstr=(Select Count(PR_KEY) From ORG_Information Where Type_Cont=8 AND Org_key=o.PR_KEY) 
    FROM Organizations o 
    LEFT JOIN Org_Information I on I.ORG_KEY = O.PR_KEY 
    LEFT JOIN Managers m ON m.ORG_ID = o.PR_KEY
    LEFT JOIN Primary_Request P on P.ORG_KEY = O.PR_KEY 
    WHERE o.OTM=0
      AND m.Dismissed=1
      AND m.Person_ID=212
      AND I.Data>= '30.04.2011'
      AND I.Data<='20.10.2011'
    order by org_name
  • + Избавляемся от подзапроса:
    Обратите внимание, что только 1 строчка поменялась.
    SELECT Distinct 
      o.PR_KEY,
      o.ORG_NAME,
      o.Rang,
      Zayv=Count(P.PR_KEY)OVER(PARTITION BY o.PR_KEY), /*1*/
      Vstr=(Select Count(PR_KEY) From ORG_Information Where Type_Cont=8 AND Org_key=o.PR_KEY) 
    FROM Organizations o 
    LEFT JOIN Org_Information I on I.ORG_KEY = O.PR_KEY 
    LEFT JOIN Managers m ON m.ORG_ID = o.PR_KEY
    LEFT JOIN Primary_Request P on P.ORG_KEY = O.PR_KEY 
    WHERE o.OTM=0
      AND m.Dismissed=1
      AND m.Person_ID=212
      AND I.Data>= '30.04.2011'
      AND I.Data<='20.10.2011'
    order by org_name
    + Сравните с вашим вариантом:
    SELECT Distinct 
      o.PR_KEY,
      o.ORG_NAME,
      o.Rang,
      Count(*) Zayv,
      Vstr=(Select Count(PR_KEY) From ORG_Information Where Type_Cont=8 AND Org_key=o.PR_KEY)
    FROM Organizations o
    LEFT JOIN Org_Information I on I.ORG_KEY = O.PR_KEY 
    LEFT JOIN Managers m ON m.ORG_ID = o.PR_KEY
    LEFT JOIN Primary_Request P on P.ORG_KEY = O.PR_KEY 
    where I.Data>= '30.04.2011' AND I.Data<='20.10.2011' 
    group by o.PR_KEY,p.Org_key, o.ORG_NAME, o.Rang, o.OTM , m.Dismissed, m.Person_ID, I.Data, I.Type_Cont
    having (o.OTM=0)  AND (m.Dismissed=1) AND (m.Person_ID=212)
    order by org_name
    Логические ошибки:
    1. почему вы используете Count(*) вместо Count(Primary_Request.PR_KEY) - теперь еще считаете NULL-ы? ( см. http://msdn.microsoft.com/en-us/library/ms175997.aspx )
    2. зачем Вы вынесли
    (o.OTM=0)  AND (m.Dismissed=1) AND (m.Person_ID=212)
    из WHERE в GROUP BY и HAVING?( см. http://msdn.microsoft.com/ru-ru/library/ms180199.aspx )
    3. зачем Вы группируете по I.Data, I.Type_Cont?
    Если исправить Ваш запрос, то будет:
    SELECT Distinct 
      o.PR_KEY,
      o.ORG_NAME,
      o.Rang,
      Count(P.PR_KEY) Zayv,
      Vstr=(Select Count(PR_KEY) From ORG_Information Where Type_Cont=8 AND Org_key=o.PR_KEY)
    FROM Organizations o 
    LEFT JOIN Org_Information I on I.ORG_KEY = O.PR_KEY 
    LEFT JOIN Managers m ON m.ORG_ID = o.PR_KEY
    LEFT JOIN Primary_Request P on P.ORG_KEY = O.PR_KEY 
    where I.Data>= '30.04.2011' AND I.Data<='20.10.2011' 
      AND (o.OTM=0)  AND (m.Dismissed=1) AND (m.Person_ID=212)
    group by o.PR_KEY, o.ORG_NAME, o.Rang
    order by org_name
    Удачи.
    20 окт 11, 21:56    [11475629]     Ответить | Цитировать Сообщить модератору
     Re: ошибка в скрипте  [new]
    SDA_H
    Member

    Откуда:
    Сообщений: 283
    СПАСИБО!!!
    21 окт 11, 14:02    [11478756]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить