powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Скрипт перестает отрабатывать после Full join
27 сообщений из 27, показаны все 2 страниц
Скрипт перестает отрабатывать после Full join
    #40012079
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. У меня проблема, которую уже третий день, я не могу решить.
Мне нужен скрипт, который бы отображал, какие занесенные данные были в определенные таблицы в конкретные даты.
Я создала 5 подзапросов по этим таблицам - все отлично работает.
Но теперь мне нужно, чтобы это все собиралось в одну таблицу. Три из пяти собрались при помощи FULL OUTER JOIN, а вот остальные две перестают работать. То есть ошибок нет, он крутит, пытается выполнить, но больше двух часов (дальше я уже ждать переставала и отменяла). Когда я выделяю только эти подзапросы, они прекрасно и быстро отрабатывают, но почему не получается после объединения. Точнее получается, если речь идет о 10-15 днях сентября, а если с 25 августа по 2 сентября, допустим, то уже все... Не выполняет.

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
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)



Кажется у меня кривые руки...
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40012080
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
katish444, или может есть другой способ их объеденить?
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40012088
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поставьте себе хоть какой нибудь форматтер кода. Кто же будет читать вот эту кучу? Перепишите ваш код с помошью СТЕ, выполняйте блоки отдельно и смотрите на время выполнения и объёмы данных индивидуально.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
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)

...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40012100
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Общие советы:

1. Попробуйте разбить фулл на лефт и райт и обработать отдельно.
2. Иногда очень помогают промежуточные временные таблицы. Накидывайте в них полуготовые данные и дальше работайте с ними, а не с боевыми таблицами.
3. Если портянка огромна, не нужно ее выкладывать. Все равно никто не будет вникать.
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40012130
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PizzaPizza, спасибо большое.
А вы не подскажете что такое CTE. Это аддон какой-то для sql менеджера?
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40012132
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
L_argo, О! Временные таблицы я еще не пробовала! Спасибо большое за советы
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40012137
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PizzaPizza, если не сложно подскажите, пожалуйста как вы привели мой скрипт в такой прекрасный читабельный вид. Я это делала раньше, но время в декретном отпуске напрочь отшибло мне память))) Раньше я вроде нажимала кнопку на панеле инструментов в sql manager, но не могу ее найти, поэтому получается в действительности тяжело читабельный код
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40012142
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
katish444,

длz форматирования необходимо установить дополнение к студии сторонних разработчиков, например отсюда: apexsql.com
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40012150
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
katish444
как вы привели мой скрипт в такой прекрасный читабельный вид.


например
http://poorsql.com/
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40012153
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
фулл джойн можно попытаться старым дедовским методом заменить на union all
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40012155
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем, буду пробовать
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40012301
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СТЕ = common-table-expression

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

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

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



вы пишете
Код: sql
1.
2.
3.
4.
5.
(много букв) a
(много букв) b
(много букв) c

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



и можете выполнять удобно отдельные блоки и читать их гораздо легче
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40012334
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PizzaPizza, то есть можно им просто присвоить псевдонимы, а уже потом соединять именно их? Спасибо большое, попробую. Или их надо в виртуальные таблицы впихнуть?
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40012353
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
имхо, самый простой способ, просто сформировать промежуточные таблицы и "вручную" посчитать, как будет выглядеть соединение.
тем более, что имеются конкретные зацепки по датам
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40012386
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
их не надо никуда впихивать, это один запрос просто в этом варианте синтаксисе подзапросы вынесены в отдельные текстовые/синтаксические блоки для удобства чтения. Выполняется это все как и ваш запрос, только читать и легче и удобнее выполнять отдельные части для диагностики.

ЗЫ. В Сервере есть временные таблицы и табличные переменные. Если вы любое из этого называете виртуальными таблицами, то нет - ничего туда не надо вставлять. Идея в том, что бы вы могли выполнить ваш запрос по отдельным частям, посмотреть ожидаемые ли вы получаете результаты от этих частей запроса и подумать как может выглядеть результат объединения этих промежуточных результатов.
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40012394
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
katish444
Три из пяти собрались при помощи FULL OUTER JOIN, а вот остальные две перестают работать. То есть ошибок нет, он крутит, пытается выполнить, но больше двух часов (дальше я уже ждать переставала и отменяла).
Точно нет логической ошибка в условиях? А то похоже на кросс-джойн

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


а не по двум (и для второго подзапроса, и вообще для всех)?
Код: sql
1.
ON hlpl.PROSPECT = hll.PROSPECT AND hlpl.PROJECTCODE = hll.PROJECTCODE
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40012453
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,
авторON hlpl.PROSPECT = hll.PROSPECT AND hlpl.PROJECTCODE = hll.PROJECTCODE

Думаю тут одно другому не мешает. Прожекты содержат Проспекты, но ни те, ни другие не повторяются. По сути, разницы нет
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40012455
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PizzaPizza, да, я каждый блок изначала писала и выполняла отдельно. Каждый блок по отдельности работает. Результат каждого блока примерно одинаков: Проект, Проспект и подсчет загруженных данных за период в эту таблицу.
Результат должен быть таков: Все проекты, Все проспекты и столбцы с подсчетом количества загруженных данных из блоков.
Вот я Эти самые блоки full join-ила и вместе они перестали работать...
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40012466
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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?
Хотя, если данных много, глазами это не увидеть, лучше всё таки запросом.
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40016817
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg, да, все Prospect уникальны. Это как допустим, Страны СССР(Project) и Мегаполисы СССР(Prospect). Они уникальны
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40016908
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
katish444
alexeyvg, да, все Prospect уникальны. Это как допустим, Страны СССР(Project) и Мегаполисы СССР(Prospect). Они уникальны
Ещё раз, вопрос не в уникальности Prospect или Project, а в уникальности поля ProjectCode в результатах конкретного, вашего, запроса (точнее, в четырёх ваших запросах ).
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40016910
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
katish444
alexeyvg, да, все Prospect уникальны. Это как допустим, Страны СССР(Project) и Мегаполисы СССР(Prospect). Они уникальны
Ещё раз, вопрос не в уникальности Prospect или Project, а в уникальности поля ProjectCode в результатах конкретного, вашего, запроса (точнее, в четырёх ваших запросах ).
Это же легко проверить, зачем вообще думать, уникальность есть или нет? Вопрос же одной минуты.
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40016913
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
katish444
alexeyvg, да, все Prospect уникальны. Это как допустим, Страны СССР(Project) и Мегаполисы СССР(Prospect). Они уникальны
Ещё раз, вопрос не в уникальности Prospect или Project, а в уникальности поля ProjectCode в результатах конкретного, вашего, запроса (точнее, в четырёх ваших запросах ).
Попробую по другому объяснить.
Независимо от модели данных, от уникальности полей, и от результатов этих нескольких запросов и подзапросов, писать GROUP BY a, b, и делать в соединение только по полю a, является ошибкой.
Такой ошибочный код не должен пропускаться, а рассуждения про уникальность вообще не должны рассматриваться.

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

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

Если PROSPECT уникален, результат будет таким же.
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40017060
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg, до меня дошло! Спасибо большое. Я убрала Projectcode из связей, а потом сделала соединение с уже готовыми данными. Правда это не очень-то помогло. На данный момент я все 4 запроса воссоздала отдельно в 4 виртупльные таблицы, а full join сделала уже между этими таблицами. Запрос работает (правда выполняется по 3-5 минут за период 3 месяца, боюсь представить, что будет за год). Но и это не самая главная проблема. Этот скрипт я запустила в нашей БД, а она не хочет работать с виртуальными таблицами и гибкой датой (то есть когда на контрольной панеле пользователь может сам протыкать диапазон дат на календаре). Если даты жестко в самом скрипте прописать, то работает.
Получается, что хитрость с виртуальными таблицами тоже отпадает. Уже не знаю, что можно еще придумать...
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40017094
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
katish444
На данный момент я все 4 запроса воссоздала отдельно в 4 виртупльные таблицы, а full join сделала уже между этими таблицами
А что такое "виртуальные таблицы"? Это временные, с #? Или переменные с @?

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

Вам сначала просто нужно попробовать добавить ещё одно поле в условие джойна, в каждый ON, и посмотреть на результат
И, второй вариант, убрать поле PROJECTCODE из GROUP BY, и заменить
Код: sql
1.
SELECT        PROJECTCODE

на
Код: sql
1.
SELECT        MAX(PROJECTCODE) as PROJECTCODE



После анализа результатов и планов для этих двух вариантов у вас (и у нас) будет больше данных для понимания ситуации, и принятия правильного решения.
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40017317
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,Алексей, методом "научного тыка" я выяснила, что проблема не в переменной таблице (DECLARE @LoadDB_holes TABLE), а формате дат. По запросу
Код: sql
1.
select getdate ()

наша БД выдает 11-Nov-2020 18:01:06.807
Видимо
Код: sql
1.
2.
CAST(a.ACTIONDATE_QLR AS DATE) BETWEEN '2020-07-01'
			AND '2020-09-30'

не спасло для режима пользователя. Ведь в таком варианте работает, а если
Код: sql
1.
2.
CAST(a.ACTIONDATE_QLR AS DATE) BETWEEN '{ctrl::Start Date}'
					AND '{ctrl::End Date}'

не работает
...
Рейтинг: 0 / 0
Скрипт перестает отрабатывать после Full join
    #40017318
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
katish444, для странице пользователя на выбор даты прописано
Код: sql
1.
=IF({Use Date Range}="False",acqdate(strcat(DAY(today()-int({Number of Days from today (You are NOT restricted to list)})),"-",MONTH(today()-int({Number of Days from today (You are NOT restricted to list)})),"-",1900+YEAR(today()-int({Number of Days from today (You are NOT restricted to list)}))),"DD-MM-YYYY"),{Start Date::prev})
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Скрипт перестает отрабатывать после Full join
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]