Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Скрипт перестает отрабатывать после Full join  [new]
katish444
Member

Откуда:
Сообщений: 274
Добрый день. У меня проблема, которую уже третий день, я не могу решить.
Мне нужен скрипт, который бы отображал, какие занесенные данные были в определенные таблицы в конкретные даты.
Я создала 5 подзапросов по этим таблицам - все отлично работает.
Но теперь мне нужно, чтобы это все собиралось в одну таблицу. Три из пяти собрались при помощи FULL OUTER JOIN, а вот остальные две перестают работать. То есть ошибок нет, он крутит, пытается выполнить, но больше двух часов (дальше я уже ждать переставала и отменяла). Когда я выделяю только эти подзапросы, они прекрасно и быстро отрабатывают, но почему не получается после объединения. Точнее получается, если речь идет о 10-15 днях сентября, а если с 25 августа по 2 сентября, допустим, то уже все... Не выполняет.

Может кто свежим взглядом укажет на мою ошибку? Или идею подкинет?

+
SELECT   hlpl.PROJECTCODE, hlpl.PROSPECT
, hll.Holes, shl.SurvHoles, geol.Holes AS GeolHoles, geol.Len AS GeoLen, sam.Coun AS Samples, 
assa.Samp AS Assay
FROM            (SELECT        pr.PROJECTCODE, pc.PROJECTNAME, pc.DESCRIPTION AS Desc_P, pr.PROSPECT, pr.DESCRIPTION, pr.PROSPECTNAME
FROM            PROSPECT AS pr LEFT OUTER JOIN
					PROJECT AS pc ON pr.PROJECTCODE = pc.PROJECTCODE) AS hlpl FULL OUTER JOIN
(SELECT        q.PROJECTCODE, hl.PROSPECT, COUNT(hl.PROSPECT) AS Holes
FROM            QLOH_OBJECTTRANSACTION AS q LEFT OUTER JOIN
							QLR_ACTION AS a ON q.CHANGENUMBER = a.CHANGENUMBER RIGHT OUTER JOIN
							HOLELOCATION AS hl ON hl.HOLEID = q.HOLEID
WHERE        (CAST(a.ACTIONDATE_QLR AS date) BETWEEN '2020-08-25' AND '2020-09-02') AND (a.TABLENAME_QLR LIKE 'holelocation') AND (a.ACTION_QLR = 'I')
GROUP BY q.PROJECTCODE, hl.PROSPECT) AS hll ON hlpl.PROSPECT = hll.PROSPECT FULL OUTER JOIN
(SELECT        PROJECTCODE, PROSPECT, COUNT(PROJECTCODE) AS SurvHoles
FROM            (SELECT        HOLEID, PROJECTCODE, COUNT(HOLEID) AS caca, PROSPECT
							FROM            (SELECT        q.HOLEID, q.PROJECTCODE, MAX(a.ACTIONDATE_QLR) AS caca, hs.PROSPECT, q.CHANGENUMBER, a.ACTIONDATE_QLR
													FROM            QLOH_OBJECTTRANSACTION AS q LEFT OUTER JOIN
																				QLR_ACTION AS a ON q.CHANGENUMBER = a.CHANGENUMBER LEFT OUTER JOIN
																					(SELECT        hl.HOLEID, hl.PROJECTCODE, p.PROSPECT
																					FROM            HOLESURVEY AS hl LEFT OUTER JOIN
																						HOLELOCATION AS p ON hl.PROJECTCODE = p.PROJECTCODE AND hl.HOLEID = p.HOLEID
																					WHERE        (p.PROSPECT IS NOT NULL)) AS hs ON q.HOLEID = hs.HOLEID
				WHERE    (a.TABLENAME_QLR = 'holesurvey') AND (CAST(a.ACTIONDATE_QLR AS date) BETWEEN '2020-08-25' AND '2020-09-02')
				 AND (a.ACTION_QLR = 'I') AND (hs.PROSPECT IS NOT NULL)
													GROUP BY q.HOLEID, q.PROJECTCODE, hs.PROSPECT, q.CHANGENUMBER, a.ACTIONDATE_QLR) AS hol
							GROUP BY HOLEID, PROJECTCODE, PROSPECT) AS ne
WHERE        (PROSPECT IS NOT NULL)
GROUP BY PROJECTCODE, PROSPECT) AS shl ON hlpl.PROSPECT = shl.PROSPECT FULL OUTER JOIN
(SELECT        PROJECTCODE, PROSPECT, COUNT(HOLEID) AS Holes, SUM(Leng) AS Len
FROM            (SELECT        HOLEID, PROJECTCODE, PROSPECT, MAX(GEOLTO) - MIN(GEOLFROM) AS Leng
							FROM            (SELECT        hl.HOLEID, hl.PROJECTCODE, p.PROSPECT, hl.GEOLFROM, hl.GEOLTO, hl.NAME, hl.VALUE
													FROM            GEODETAILS AS hl LEFT OUTER JOIN
																				HOLELOCATION AS p ON hl.PROJECTCODE = p.PROJECTCODE AND hl.HOLEID = p.HOLEID
													WHERE        (hl.NAME = 'Lith_LoggedDate')
													AND (CAST(hl.VALUE AS date) BETWEEN '2020-08-25' AND '2020-09-02')) AS ss
							GROUP BY HOLEID, PROJECTCODE, PROSPECT) AS geo
GROUP BY PROJECTCODE, PROSPECT) AS geol ON geol.PROSPECT = hlpl.PROSPECT FULL OUTER JOIN

-- вот с этим не идет объединение
(SELECT        PROJECTCODE, COUNT(PROJECTCODE) AS Coun, PROSPECT
FROM            (SELECT        s.SAMPLEID AS Samp, q.PROJECTCODE, MAX(s.SAMPTO) AS Co, s.PROSPECT
							FROM            QLOH_OBJECTTRANSACTION AS q LEFT OUTER JOIN
													QLR_ACTION AS a ON q.CHANGENUMBER = a.CHANGENUMBER LEFT OUTER JOIN
														(SELECT        hl.HOLEID, hl.PROJECTCODE, hl.SAMPTO, hl.SAMPLEID, p.PROSPECT
															FROM            SAMPLE AS hl LEFT OUTER JOIN
																					HOLELOCATION AS p ON hl.PROJECTCODE = p.PROJECTCODE 
																					AND hl.HOLEID = p.HOLEID) AS s ON s.HOLEID = q.HOLEID
							WHERE        (CAST(a.ACTIONDATE_QLR AS date) BETWEEN '2020-08-25' AND '2020-09-02') AND (a.TABLENAME_QLR LIKE 'sample')
							 AND (s.PROSPECT IS NOT NULL) AND (a.ACTION_QLR = 'I')
							GROUP BY s.SAMPLEID, q.PROJECTCODE, s.PROSPECT) AS ass
GROUP BY PROJECTCODE, PROSPECT) AS sam ON sam.PROSPECT = hlpl.PROSPECT FULL OUTER JOIN

---- вот с этим не идет объединение
(SELECT        PROJECTCODE, PROSPECT, COUNT(Samp) AS Samp
FROM            (SELECT        s.SAMPLEID AS Samp, q.PROJECTCODE, MAX(s.SAMPTO) AS Co, s.PROSPECT, s.HOLEID
							FROM            QLOH_OBJECTTRANSACTION AS q LEFT OUTER JOIN
													QLR_ACTION AS a ON q.CHANGENUMBER = a.CHANGENUMBER LEFT OUTER JOIN
														(SELECT        hl.HOLEID, hl.PROJECTCODE, hl.SAMPTO, hl.SAMPLEID, p.PROSPECT
															FROM            SAMPLE AS hl LEFT OUTER JOIN
																					HOLELOCATION AS p ON hl.PROJECTCODE = p.PROJECTCODE 
																					AND hl.HOLEID = p.HOLEID AND p.PROSPECT IS NOT NULL) AS s ON s.HOLEID = q.HOLEID
							WHERE        (CAST(a.ACTIONDATE_QLR AS date) BETWEEN '2020-08-25' AND '2020-09-02') AND (a.TABLENAME_QLR LIKE 'corpsampleassay') 
							AND (s.PROSPECT IS NOT NULL) AND (a.ACTION_QLR = 'I')
							GROUP BY s.SAMPLEID, q.PROJECTCODE, s.PROSPECT, s.HOLEID) AS d
GROUP BY PROJECTCODE, PROSPECT) AS assa ON assa.PROSPECT = hlpl.PROSPECT
WHERE        (hll.PROSPECT IS NOT NULL) OR
(shl.PROSPECT IS NOT NULL) OR
(sam.PROSPECT IS NOT NULL) OR
(geol.PROSPECT IS NOT NULL) OR
(assa.PROSPECT IS NOT NULL)


Кажется у меня кривые руки...
27 окт 20, 05:53    [22221205]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
katish444
Member

Откуда:
Сообщений: 274
katish444, или может есть другой способ их объеденить?
27 окт 20, 05:56    [22221206]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
PizzaPizza
Member

Откуда:
Сообщений: 399
Поставьте себе хоть какой нибудь форматтер кода. Кто же будет читать вот эту кучу? Перепишите ваш код с помошью СТЕ, выполняйте блоки отдельно и смотрите на время выполнения и объёмы данных индивидуально.
+

SELECT hlpl.PROJECTCODE
    , hlpl.PROSPECT
    , hll.Holes
    , shl.SurvHoles
    , geol.Holes AS GeolHoles
    , geol.Len AS GeoLen
    , sam.Coun AS Samples
    , assa.Samp AS Assay
FROM (
    SELECT pr.PROJECTCODE
        , pc.PROJECTNAME
        , pc.DESCRIPTION AS Desc_P
        , pr.PROSPECT
        , pr.DESCRIPTION
        , pr.PROSPECTNAME
    FROM PROSPECT AS pr
    LEFT OUTER JOIN PROJECT AS pc
        ON pr.PROJECTCODE = pc.PROJECTCODE
    ) AS hlpl
FULL OUTER JOIN (
    SELECT q.PROJECTCODE
        , hl.PROSPECT
        , COUNT(hl.PROSPECT) AS Holes
    FROM QLOH_OBJECTTRANSACTION AS q
    LEFT OUTER JOIN QLR_ACTION AS a
        ON q.CHANGENUMBER = a.CHANGENUMBER
    RIGHT OUTER JOIN HOLELOCATION AS hl
        ON hl.HOLEID = q.HOLEID
    WHERE (CAST(a.ACTIONDATE_QLR AS DATE) BETWEEN '2020-08-25' AND '2020-09-02')
        AND (a.TABLENAME_QLR LIKE 'holelocation')
        AND (a.ACTION_QLR = 'I')
    GROUP BY q.PROJECTCODE
        , hl.PROSPECT
    ) AS hll
    ON hlpl.PROSPECT = hll.PROSPECT
FULL OUTER JOIN (
    SELECT PROJECTCODE
        , PROSPECT
        , COUNT(PROJECTCODE) AS SurvHoles
    FROM (
        SELECT HOLEID
            , PROJECTCODE
            , COUNT(HOLEID) AS caca
            , PROSPECT
        FROM (
            SELECT q.HOLEID
                , q.PROJECTCODE
                , MAX(a.ACTIONDATE_QLR) AS caca
                , hs.PROSPECT
                , q.CHANGENUMBER
                , a.ACTIONDATE_QLR
            FROM QLOH_OBJECTTRANSACTION AS q
            LEFT OUTER JOIN QLR_ACTION AS a
                ON q.CHANGENUMBER = a.CHANGENUMBER
            LEFT OUTER JOIN (
                SELECT hl.HOLEID
                    , hl.PROJECTCODE
                    , p.PROSPECT
                FROM HOLESURVEY AS hl
                LEFT OUTER JOIN HOLELOCATION AS p
                    ON hl.PROJECTCODE = p.PROJECTCODE
                        AND hl.HOLEID = p.HOLEID
                WHERE (p.PROSPECT IS NOT NULL)
                ) AS hs
                ON q.HOLEID = hs.HOLEID
            WHERE (a.TABLENAME_QLR = 'holesurvey')
                AND (CAST(a.ACTIONDATE_QLR AS DATE) BETWEEN '2020-08-25' AND '2020-09-02')
                AND (a.ACTION_QLR = 'I')
                AND (hs.PROSPECT IS NOT NULL)
            GROUP BY q.HOLEID
                , q.PROJECTCODE
                , hs.PROSPECT
                , q.CHANGENUMBER
                , a.ACTIONDATE_QLR
            ) AS hol
        GROUP BY HOLEID
            , PROJECTCODE
            , PROSPECT
        ) AS ne
    WHERE (PROSPECT IS NOT NULL)
    GROUP BY PROJECTCODE
        , PROSPECT
    ) AS shl
    ON hlpl.PROSPECT = shl.PROSPECT
FULL OUTER JOIN (
    SELECT PROJECTCODE
        , PROSPECT
        , COUNT(HOLEID) AS Holes
        , SUM(Leng) AS Len
    FROM (
        SELECT HOLEID
            , PROJECTCODE
            , PROSPECT
            , MAX(GEOLTO) - MIN(GEOLFROM) AS Leng
        FROM (
            SELECT hl.HOLEID
                , hl.PROJECTCODE
                , p.PROSPECT
                , hl.GEOLFROM
                , hl.GEOLTO
                , hl.NAME
                , hl.VALUE
            FROM GEODETAILS AS hl
            LEFT OUTER JOIN HOLELOCATION AS p
                ON hl.PROJECTCODE = p.PROJECTCODE
                    AND hl.HOLEID = p.HOLEID
            WHERE (hl.NAME = 'Lith_LoggedDate')
                AND (CAST(hl.VALUE AS DATE) BETWEEN '2020-08-25' AND '2020-09-02')
            ) AS ss
        GROUP BY HOLEID
            , PROJECTCODE
            , PROSPECT
        ) AS geo
    GROUP BY PROJECTCODE
        , PROSPECT
    ) AS geol
    ON geol.PROSPECT = hlpl.PROSPECT
FULL OUTER JOIN
    -- вот с этим не идет объединение
    (
    SELECT PROJECTCODE
        , COUNT(PROJECTCODE) AS Coun
        , PROSPECT
    FROM (
        SELECT s.SAMPLEID AS Samp
            , q.PROJECTCODE
            , MAX(s.SAMPTO) AS Co
            , s.PROSPECT
        FROM QLOH_OBJECTTRANSACTION AS q
        LEFT OUTER JOIN QLR_ACTION AS a
            ON q.CHANGENUMBER = a.CHANGENUMBER
        LEFT OUTER JOIN (
            SELECT hl.HOLEID
                , hl.PROJECTCODE
                , hl.SAMPTO
                , hl.SAMPLEID
                , p.PROSPECT
            FROM SAMPLE AS hl
            LEFT OUTER JOIN HOLELOCATION AS p
                ON hl.PROJECTCODE = p.PROJECTCODE
                    AND hl.HOLEID = p.HOLEID
            ) AS s
            ON s.HOLEID = q.HOLEID
        WHERE (CAST(a.ACTIONDATE_QLR AS DATE) BETWEEN '2020-08-25' AND '2020-09-02')
            AND (a.TABLENAME_QLR LIKE 'sample')
            AND (s.PROSPECT IS NOT NULL)
            AND (a.ACTION_QLR = 'I')
        GROUP BY s.SAMPLEID
            , q.PROJECTCODE
            , s.PROSPECT
        ) AS ass
    GROUP BY PROJECTCODE
        , PROSPECT
    ) AS sam
    ON sam.PROSPECT = hlpl.PROSPECT
FULL OUTER JOIN
    ---- вот с этим не идет объединение
    (
    SELECT PROJECTCODE
        , PROSPECT
        , COUNT(Samp) AS Samp
    FROM (
        SELECT s.SAMPLEID AS Samp
            , q.PROJECTCODE
            , MAX(s.SAMPTO) AS Co
            , s.PROSPECT
            , s.HOLEID
        FROM QLOH_OBJECTTRANSACTION AS q
        LEFT OUTER JOIN QLR_ACTION AS a
            ON q.CHANGENUMBER = a.CHANGENUMBER
        LEFT OUTER JOIN (
            SELECT hl.HOLEID
                , hl.PROJECTCODE
                , hl.SAMPTO
                , hl.SAMPLEID
                , p.PROSPECT
            FROM SAMPLE AS hl
            LEFT OUTER JOIN HOLELOCATION AS p
                ON hl.PROJECTCODE = p.PROJECTCODE
                    AND hl.HOLEID = p.HOLEID
                    AND p.PROSPECT IS NOT NULL
            ) AS s
            ON s.HOLEID = q.HOLEID
        WHERE (CAST(a.ACTIONDATE_QLR AS DATE) BETWEEN '2020-08-25' AND '2020-09-02')
            AND (a.TABLENAME_QLR LIKE 'corpsampleassay')
            AND (s.PROSPECT IS NOT NULL)
            AND (a.ACTION_QLR = 'I')
        GROUP BY s.SAMPLEID
            , q.PROJECTCODE
            , s.PROSPECT
            , s.HOLEID
        ) AS d
    GROUP BY PROJECTCODE
        , PROSPECT
    ) AS assa
    ON assa.PROSPECT = hlpl.PROSPECT
WHERE (hll.PROSPECT IS NOT NULL)
    OR (shl.PROSPECT IS NOT NULL)
    OR (sam.PROSPECT IS NOT NULL)
    OR (geol.PROSPECT IS NOT NULL)
    OR (assa.PROSPECT IS NOT NULL)


Сообщение было отредактировано: 27 окт 20, 07:29
27 окт 20, 07:30    [22221218]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
L_argo
Member

Откуда:
Сообщений: 1297
Общие советы:

1. Попробуйте разбить фулл на лефт и райт и обработать отдельно.
2. Иногда очень помогают промежуточные временные таблицы. Накидывайте в них полуготовые данные и дальше работайте с ними, а не с боевыми таблицами.
3. Если портянка огромна, не нужно ее выкладывать. Все равно никто не будет вникать.
27 окт 20, 10:20    [22221256]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
katish444
Member

Откуда:
Сообщений: 274
PizzaPizza, спасибо большое.
А вы не подскажете что такое CTE. Это аддон какой-то для sql менеджера?
27 окт 20, 11:37    [22221306]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
katish444
Member

Откуда:
Сообщений: 274
L_argo, О! Временные таблицы я еще не пробовала! Спасибо большое за советы
27 окт 20, 11:38    [22221309]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
katish444
Member

Откуда:
Сообщений: 274
PizzaPizza, если не сложно подскажите, пожалуйста как вы привели мой скрипт в такой прекрасный читабельный вид. Я это делала раньше, но время в декретном отпуске напрочь отшибло мне память))) Раньше я вроде нажимала кнопку на панеле инструментов в sql manager, но не могу ее найти, поэтому получается в действительности тяжело читабельный код
27 окт 20, 11:43    [22221315]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8047
katish444,

длz форматирования необходимо установить дополнение к студии сторонних разработчиков, например отсюда: apexsql.com
27 окт 20, 12:09    [22221324]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
komrad
Member

Откуда:
Сообщений: 5345
katish444
как вы привели мой скрипт в такой прекрасный читабельный вид.


например
http://poorsql.com/
27 окт 20, 12:26    [22221335]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54382
фулл джойн можно попытаться старым дедовским методом заменить на union all
27 окт 20, 12:32    [22221338]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
katish444
Member

Откуда:
Сообщений: 274
Спасибо всем, буду пробовать
27 окт 20, 12:39    [22221342]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
PizzaPizza
Member

Откуда:
Сообщений: 399
СТЕ = common-table-expression

https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql?view=sql-server-ver15

вы выносите подзапросы в отдельные именованные блоки кода

Вместо
select * from (много букв) a соединение (много букв) b соединение (много букв) c


вы пишете
(много букв) a
(много букв) b
(много букв) c

select from  a соединение b соединение c


и можете выполнять удобно отдельные блоки и читать их гораздо легче
27 окт 20, 17:33    [22221591]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
katish444
Member

Откуда:
Сообщений: 274
PizzaPizza, то есть можно им просто присвоить псевдонимы, а уже потом соединять именно их? Спасибо большое, попробую. Или их надо в виртуальные таблицы впихнуть?
27 окт 20, 19:23    [22221682]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
godsql
Member

Откуда:
Сообщений: 134
имхо, самый простой способ, просто сформировать промежуточные таблицы и "вручную" посчитать, как будет выглядеть соединение.
тем более, что имеются конкретные зацепки по датам
27 окт 20, 20:18    [22221719]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
PizzaPizza
Member

Откуда:
Сообщений: 399
их не надо никуда впихивать, это один запрос просто в этом варианте синтаксисе подзапросы вынесены в отдельные текстовые/синтаксические блоки для удобства чтения. Выполняется это все как и ваш запрос, только читать и легче и удобнее выполнять отдельные части для диагностики.

ЗЫ. В Сервере есть временные таблицы и табличные переменные. Если вы любое из этого называете виртуальными таблицами, то нет - ничего туда не надо вставлять. Идея в том, что бы вы могли выполнить ваш запрос по отдельным частям, посмотреть ожидаемые ли вы получаете результаты от этих частей запроса и подумать как может выглядеть результат объединения этих промежуточных результатов.

Сообщение было отредактировано: 27 окт 20, 22:28
27 окт 20, 22:27    [22221776]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
katish444
Три из пяти собрались при помощи FULL OUTER JOIN, а вот остальные две перестают работать. То есть ошибок нет, он крутит, пытается выполнить, но больше двух часов (дальше я уже ждать переставала и отменяла).
Точно нет логической ошибка в условиях? А то похоже на кросс-джойн

Точно должна быть связка по одному полю:
ON hlpl.PROSPECT = hll.PROSPECT

а не по двум (и для второго подзапроса, и вообще для всех)?
ON hlpl.PROSPECT = hll.PROSPECT AND hlpl.PROJECTCODE = hll.PROJECTCODE
27 окт 20, 22:53    [22221786]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
katish444
Member

Откуда:
Сообщений: 274
alexeyvg,
автор
ON hlpl.PROSPECT = hll.PROSPECT AND hlpl.PROJECTCODE = hll.PROJECTCODE


Думаю тут одно другому не мешает. Прожекты содержат Проспекты, но ни те, ни другие не повторяются. По сути, разницы нет
28 окт 20, 08:22    [22221884]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
katish444
Member

Откуда:
Сообщений: 274
PizzaPizza, да, я каждый блок изначала писала и выполняла отдельно. Каждый блок по отдельности работает. Результат каждого блока примерно одинаков: Проект, Проспект и подсчет загруженных данных за период в эту таблицу.
Результат должен быть таков: Все проекты, Все проспекты и столбцы с подсчетом количества загруженных данных из блоков.
Вот я Эти самые блоки full join-ила и вместе они перестали работать...
28 окт 20, 08:25    [22221888]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
katish444
alexeyvg,
автор
ON hlpl.PROSPECT = hll.PROSPECT AND hlpl.PROJECTCODE = hll.PROJECTCODE


Думаю тут одно другому не мешает. Прожекты содержат Проспекты, но ни те, ни другие не повторяются. По сути, разницы нет
Какая разница, повторяются или нет? Важно, что бы поле PROSPECT было уникально в результатах (под)запроса.
Проверить неуникальность можно за полминуты, а симптомы говорят в первую очередь именно именно про это.

Или, если вы правы, то обязательно нужно убрать поле PROJECTCODE из списка полей SELECT и из GROUP BY в подзапросах.
Потому что PROJECTCODE в результатах не используется, и получается "грязный", ужасно некрасивый код, к тому же загружающий сервер лишней работой.

Но я всё таки думаю, что PROSPECT в подзапросах неуникален, PROJECTCODE должен быть в ON, по бизнес-логике.
katish444
PizzaPizza, да, я каждый блок изначала писала и выполняла отдельно
И как, за период "с 25 августа по 2 сентября" в результатах ни одного одинакового значения PROSPECT?
Хотя, если данных много, глазами это не увидеть, лучше всё таки запросом.
28 окт 20, 08:57    [22221903]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
katish444
Member

Откуда:
Сообщений: 274
alexeyvg, да, все Prospect уникальны. Это как допустим, Страны СССР(Project) и Мегаполисы СССР(Prospect). Они уникальны
10 ноя 20, 14:04    [22229561]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
katish444
alexeyvg, да, все Prospect уникальны. Это как допустим, Страны СССР(Project) и Мегаполисы СССР(Prospect). Они уникальны
Ещё раз, вопрос не в уникальности Prospect или Project, а в уникальности поля ProjectCode в результатах конкретного, вашего, запроса (точнее, в четырёх ваших запросах).
10 ноя 20, 18:00    [22229724]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
alexeyvg
katish444
alexeyvg, да, все Prospect уникальны. Это как допустим, Страны СССР(Project) и Мегаполисы СССР(Prospect). Они уникальны
Ещё раз, вопрос не в уникальности Prospect или Project, а в уникальности поля ProjectCode в результатах конкретного, вашего, запроса (точнее, в четырёх ваших запросах).
Это же легко проверить, зачем вообще думать, уникальность есть или нет? Вопрос же одной минуты.
10 ноя 20, 18:01    [22229727]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
alexeyvg
katish444
alexeyvg, да, все Prospect уникальны. Это как допустим, Страны СССР(Project) и Мегаполисы СССР(Prospect). Они уникальны
Ещё раз, вопрос не в уникальности Prospect или Project, а в уникальности поля ProjectCode в результатах конкретного, вашего, запроса (точнее, в четырёх ваших запросах).
Попробую по другому объяснить.
Независимо от модели данных, от уникальности полей, и от результатов этих нескольких запросов и подзапросов, писать GROUP BY a, b, и делать в соединение только по полю a, является ошибкой.
Такой ошибочный код не должен пропускаться, а рассуждения про уникальность вообще не должны рассматриваться.

Это как математическая операция над полем-строкой, "а у меня там будут только цифры".
Так писать нельзя, ошибка, невалидный код, на код-ревью он должен отбраковываться.

Если вы уверены, что PROSPECT уникален, просто уберите PROJECTCODE из GROUP BY, а в списке полей в SELECT используйте агрегатную функцию, например, MAX

Если PROSPECT уникален, результат будет таким же.
10 ноя 20, 18:07    [22229731]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
katish444
Member

Откуда:
Сообщений: 274
alexeyvg, до меня дошло! Спасибо большое. Я убрала Projectcode из связей, а потом сделала соединение с уже готовыми данными. Правда это не очень-то помогло. На данный момент я все 4 запроса воссоздала отдельно в 4 виртупльные таблицы, а full join сделала уже между этими таблицами. Запрос работает (правда выполняется по 3-5 минут за период 3 месяца, боюсь представить, что будет за год). Но и это не самая главная проблема. Этот скрипт я запустила в нашей БД, а она не хочет работать с виртуальными таблицами и гибкой датой (то есть когда на контрольной панеле пользователь может сам протыкать диапазон дат на календаре). Если даты жестко в самом скрипте прописать, то работает.
Получается, что хитрость с виртуальными таблицами тоже отпадает. Уже не знаю, что можно еще придумать...
11 ноя 20, 11:11    [22229999]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт перестает отрабатывать после Full join  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
katish444
На данный момент я все 4 запроса воссоздала отдельно в 4 виртупльные таблицы, а full join сделала уже между этими таблицами
А что такое "виртуальные таблицы"? Это временные, с #? Или переменные с @?

Это, возможно, не лучший вариант, т.к. на них же нет индексов.
Но часто такой приём оптимизации срабатывает, тем более что индексы можно построить и на временных таблицах

Вам сначала просто нужно попробовать добавить ещё одно поле в условие джойна, в каждый ON, и посмотреть на результат
И, второй вариант, убрать поле PROJECTCODE из GROUP BY, и заменить
SELECT        PROJECTCODE
на
SELECT        MAX(PROJECTCODE) as PROJECTCODE


После анализа результатов и планов для этих двух вариантов у вас (и у нас) будет больше данных для понимания ситуации, и принятия правильного решения.
11 ноя 20, 12:30    [22230050]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить