Имя: Пароль:
1C
 
Прямой запрос к регистру с соединением со справочником
0 zenon46
 
04.02.21
16:39
Доброго дня! Не получается запрос к регистру с соединением со справочником.
Суть задачи, получить из регистра продажи самую крайнюю продажу по каждому контрагенту из таблицы #TempTable
Вложенный запрос с этой задачей справляется а вот наружний нет, получаю ошибку.."Недопустимое имя столбца "Контрагент".", относится к строке "ON СпрКонтрагенты.ID = ДПослПрод.Контрагент" Что не так ?

Текст запроса такой :
|SELECT
|ДПослПрод.IDDoc as [Док $Документ],
|ДПослПрод.Контрагент AS [Контрагент $Справочник.Контрагенты]
|FROM    
|(
|SELECT TOP 1
|Рег.IDDoc as [Док $Документ],
|Рег.IDDocDef as Док_вид,
|$Рег.Покупатель AS [Контрагент $Справочник.Контрагенты],
|CAST(LEFT(Рег.Date_Time_IDDoc, 8) as DateTime) AS ДатаПослПродажи
|FROM
|$Регистр.Продажи as Рег
|WHERE
|$Рег.Фирма = :ВбрФирма
|ORDER BY
|Рег.Date_Time_IDDOC DESC
|) ДПослПрод
|LEFT JOIN
|$Справочник.Контрагенты AS СпрКонтрагенты With (NOLOCK) ON СпрКонтрагенты.ID = ДПослПрод.Контрагент
|WHERE
|СпрКонтрагенты.ID IN (SELECT Val FROM #TempTable)
1 vicof
 
04.02.21
16:51
Недопустимое имя столбца Контрагент".
Плюс соединение будет как бы внутренним, а не левым.
2 Курцвейл
 
04.02.21
17:07
А зачем делаете приведение типов в подзапросе?

попробуйте так:

|SELECT
|ДПослПрод.IDDoc as [Док $Документ],
|ДПослПрод.Покупатель AS [Контрагент $Справочник.Контрагенты]
|FROM    
|(
|SELECT TOP 1
|Рег.IDDoc as [Док $Документ],
|Рег.IDDocDef as Док_вид,
|$Рег.Покупатель AS Покупатель,
|CAST(LEFT(Рег.Date_Time_IDDoc, 8) as DateTime) AS ДатаПослПродажи
|FROM
|$Регистр.Продажи as Рег
|WHERE
|$Рег.Фирма = :ВбрФирма
|ORDER BY
|Рег.Date_Time_IDDOC DESC
|) ДПослПрод
|LEFT JOIN
|$Справочник.Контрагенты AS СпрКонтрагенты With (NOLOCK) ON СпрКонтрагенты.ID = ДПослПрод.Покупатель
|WHERE
|СпрКонтрагенты.ID IN (SELECT Val FROM #TempTable)
3 zenon46
 
04.02.21
18:14
Вот так запрос запускается но результат пустой :
SELECT
ДПослПрод.Покупатель AS [Контрагент $Справочник.Контрагенты]
FROM    
(
SELECT TOP 1
Рег.IDDoc as [Док $Документ],
Рег.IDDocDef as Док_вид,
$Рег.Покупатель AS Покупатель,
CAST(LEFT(Рег.Date_Time_IDDoc, 8) as DateTime) AS ДатаПослПродажи
FROM
$Регистр.Продажи as Рег
WHERE
$Рег.Фирма = :ВбрФирма
ORDER BY
Рег.Date_Time_IDDOC DESC
) ДПослПрод
LEFT JOIN
$Справочник.Контрагенты AS СпрКонтрагенты With (NOLOCK) ON СпрКонтрагенты.ID = ДПослПрод.Покупатель
WHERE
СпрКонтрагенты.ID IN (SELECT Val FROM #TempTable)
4 zenon46
 
04.02.21
18:23
Переделал вот так , вроде работает, проверяю :

SELECT
Спр.Code AS Код,
Спр.ID AS [Контрагент $Справочник.Контрагенты],
subsel.ДатаПослПродажи
FROM #TempTable
temp left join
(
SELECT
$Рег.Покупатель AS [Контрагент],
CAST(LEFT(MAX(Рег.Date_Time_IDDOC),8) AS datetime) AS ДатаПослПродажи
FROM
$Регистр.Продажи as Рег
LEFT JOIN
$Справочник.Контрагенты AS Спр ON Спр.ID = $Рег.Покупатель
WHERE
$Рег.Фирма = :ВбрФирма
GROUP BY
$Рег.Покупатель
) subsel on temp.val = subsel.Контрагент
LEFT JOIN
$Справочник.Контрагенты AS Спр ON Спр.ID = temp.val
5 Ёпрст
 
04.02.21
19:28
(4) мот того, хотя бы так ?

SELECT
temp.val AS [Контрагент $Справочник.Контрагенты],
subsel.ДатаПослПродажи
FROM #TempTable temp
left join
(
SELECT
$Рег.Покупатель as Покупатель,
CAST(LEFT(MAX(Рег.Date_Time_IDDOC),8) AS datetime) AS ДатаПослПродажи
FROM
$Регистр.Продажи as Рег
WHERE
$Рег.Фирма = :ВбрФирма and $Рег.Покупатель in (select val from #TempTable)
GROUP BY
$Рег.Покупатель
) subsel on temp.val = subsel.Контрагент
6 Ёпрст
 
04.02.21
19:29
+5
-- subsel on temp.val = subsel.Контрагент
subsel on temp.val = subsel.Покупатель