Имя: Пароль:
1C
1C 7.7
v7: SQL запрос левое содинение
,
0 PRO100 NigGaZ
 
12.08.13
19:47
"SELECT Номенклатура [Номенклатура $Справочник.Номенклатура]
, Остаток Остаток
FROM
((SELECT Номенклатура.ID Ном
FROM $Справочник.Номенклатура AS Номенклатура With (NOLOCK)
WHERE ($Номенклатура.Артикул LIKE '%*%')) AS Товар
LEFT JOIN
(SELECT ОстаткиТМЦОстатки.Номенклатура Номенклатура
    , Sum(ОстаткиТМЦОстатки.КоличествоОстаток) Остаток
FROM $РегистрОстатки.ОстаткиТМЦ(,,,
        Номенклатура,) AS ОстаткиТМЦОстатки
GROUP BY ОстаткиТМЦОстатки.Номенклатура) AS Остатки ON Товар.Ном = Остатки.Номенклатура
)
GROUP BY Остатки.Номенклатура, Остатки.Остаток"
в левой таблице 573 записи
в правой таблице 3313 записей
на выходе получается результат как в Inner Join 281 запись, не понимаю почему ожидаю что должны быть все записи из левой таблицы, а тех которых нет в правой должны быть нули, но их нет
в QA после объединения 573 записи (нужный результат), а после Hash Match становится 281
1 КонецЦикла
 
12.08.13
20:02
Это точно весь текст? :)
Будут не нули а null
2 PRO100 NigGaZ
 
12.08.13
20:03
путь будут null
да весь текст
[code]
"|
|SELECT Номенклатура [Номенклатура $Справочник.Номенклатура]
|, Остаток Остаток
|FROM
|((SELECT Номенклатура.ID Ном
|FROM $Справочник.Номенклатура AS Номенклатура With (NOLOCK)
|WHERE ($Номенклатура.Артикул LIKE '%*%')) AS Товар
|LEFT JOIN
|(SELECT ОстаткиТМЦОстатки.Номенклатура Номенклатура
|    , Sum(ОстаткиТМЦОстатки.КоличествоОстаток) Остаток
|FROM $РегистрОстатки.ОстаткиТМЦ(,,,
|        Номенклатура,) AS ОстаткиТМЦОстатки
|GROUP BY ОстаткиТМЦОстатки.Номенклатура) AS Остатки ON Товар.Ном = Остатки.Номенклатура
|)
|GROUP BY Остатки.Номенклатура, Остатки.Остаток
|"
[/code]
3 PRO100 NigGaZ
 
12.08.13
20:06
и он выполняется
Номенклатура $Справочник.Номенклатура Остаток                                  
------------------------------------- ----------------------------------------
   5OD                                11.00000
   801                                8.00000
   8XZ                                52.00000
4 КонецЦикла
 
12.08.13
20:08
Только позиции с остатками выводятся?
Надо все товары с артикулом подобным *?
Зачем в груп бай обернул?
5 PRO100 NigGaZ
 
12.08.13
20:11
да выводятся только с остатками
Да это только частный пример отбора по вхождению в артикул
в каком  месте?
GROUP BY Остатки.Номенклатура, Остатки.Остаток
потому что суммировать не надо (значение одно) и без такой группировки ошибка (если убрать Остатки.Остаток и суммировать то результат тот же)
GROUP BY ОстаткиТМЦОстатки.Номенклатура
Нужна сумма остатков по этой группировке
6 PRO100 NigGaZ
 
12.08.13
20:18
и запрос нужен именно с left join чтобы результаты последующих запросов отфильтровать и потом работать с нужными данными, в идеале в справочнике 7тыс строк, а после всех фильтров должно стать примерно 1,5тыс
пробовал объединять в каждом запросе но время выполнения увеличивается с каждым объединением, поэтому быстрее по всем данным а потом отфильтровать...
7 m-serg74
 
12.08.13
20:25
(2) самый внешний селект из правой таблицы? это есть правильно?
8 PRO100 NigGaZ
 
12.08.13
20:30
самый внешний селект из объединения двух таблиц (Товар LEF JOIN Остатки)
в товаре отобранные элементы справочника номенклатура
в Остатках все остатки
и еще почему могут образоваться такая запись?
Номенклатура $Справочник.Номенклатура Остаток                                  
------------------------------------- ----------------------------------------
NULL                                  NULL
9 m-serg74
 
12.08.13
20:35
(8) СЕЛЕКТ Номенклатура это из правой таблицы, в левой она Ном у тебя, потому и нулл выходит так как не соединилось, напиши сам запрос красиво, иначе не поймешь что откуда
10 m-serg74
 
12.08.13
20:35

SELECT
    Номенклатура [Номенклатура $Справочник.Номенклатура],
    Остаток Остаток
FROM
((SELECT
    Номенклатура.ID Ном
FROM
    $Справочник.Номенклатура AS Номенклатура With (NOLOCK)
WHERE
    ($Номенклатура.Артикул LIKE '%*%')) AS Товар
LEFT JOIN
    (SELECT
        ОстаткиТМЦОстатки.Номенклатура Номенклатура,
        Sum(ОстаткиТМЦОстатки.КоличествоОстаток) Остаток
    FROM
        $РегистрОстатки.ОстаткиТМЦ(,,,Номенклатура,) AS ОстаткиТМЦОстатки
    GROUP BY
        ОстаткиТМЦОстатки.Номенклатура) AS Остатки
        ON Товар.Ном = Остатки.Номенклатура)
GROUP BY
    Остатки.Номенклатура,
    Остатки.Остаток
11 PRO100 NigGaZ
 
12.08.13
20:36
Разобрался последняя группировка должна быть по левой таблице...
SELECT
    Номенклатура [Номенклатура $Справочник.Номенклатура],
    Остаток Остаток
FROM
((SELECT
    Номенклатура.ID Ном
FROM
    $Справочник.Номенклатура AS Номенклатура With (NOLOCK)
WHERE
    ($Номенклатура.Артикул LIKE '%*%')) AS Товар
LEFT JOIN
    (SELECT
        ОстаткиТМЦОстатки.Номенклатура Номенклатура,
        Sum(ОстаткиТМЦОстатки.КоличествоОстаток) Остаток
    FROM
        $РегистрОстатки.ОстаткиТМЦ(,,,Номенклатура,) AS ОстаткиТМЦОстатки
    GROUP BY
        ОстаткиТМЦОстатки.Номенклатура) AS Остатки
        ON Товар.Ном = Остатки.Номенклатура)
GROUP BY
    Товар.Ном,
    Остатки.Остаток
12 m-serg74
 
12.08.13
20:38
(11) а почему вообще не
SELECT
    Ном [Номенклатура $Справочник.Номенклатура],
    Остаток Остаток
13 PRO100 NigGaZ
 
12.08.13
20:39
да правда... исправил у себя в этом месте забылся...
14 m-serg74
 
12.08.13
20:39
(11) GROUP BY
    Товар.Ном,
    Остатки.Остаток

на фига группировка по Остаток, вроде ее суммировать надо иначе ваще зачем группировка?
15 PRO100 NigGaZ
 
12.08.13
20:41
а результат что суммирования, что группировки одинаковый, или это знак плохого тона группировать вместо суммирования?
16 m-serg74
 
12.08.13
20:42
(15) не вместо, а группировать по всем полям и не делать ни сумма ни количество, какой смысл группировать тогда, сотри вообще на фиг последнее ГРУПП БАЙ
17 PRO100 NigGaZ
 
12.08.13
22:28
действительно О_о спасибо! :)
18 toypaul
 
гуру
12.08.13
22:37
есть мысль что груп бай отбрасывает нулл по полю Остаток. в груп бай конечно это поле = полный бред
19 PRO100 NigGaZ
 
13.08.13
08:38
нет не отбрасывает, и наличие группировки не несет никакой нагрузки, а вот то что селект был по правой таблице это была проблема
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.