Когда вы строите производную таблицу, вы не можете получить доступ к столбцам базовых таблиц напрямую, если они не появляются в списке после SELECT
в самом внешнем запросе производной таблицы.
Итак
SELECT a
FROM (SELECT a
FROM t) x;
работает, в то время как
SELECT b
FROM (SELECT a
FROM t) x;
не работает, даже если в t
есть столбец b
.
Но на самом деле это идет немного дальше.Вы можете выбрать любое из выражений столбцов из самого внешнего запроса, как в
SELECT y
FROM (SELECT a + b y
FROM t) x;
Но вам нужно имя для каждого из этих столбцов, заданных выражениями.Хотя некоторые системы могут автоматически генерировать пригодные для использования псевдонимы для выражений, которые некоторые не делают, и даже если они это делают, эти псевдонимы часто не «хороши» для чтения и записи.Поэтому используйте явные псевдонимы.
То, что вы не можете сделать здесь, это повторить выражение и надеяться, что это даст вам соответствующее значение.Т.е.
SELECT a + b
FROM (SELECT a + b
FROM t) x;
не будет работать.
Но последний запрос - это то, что вы делаете.
Так что либо перенесите конкатенацию во внешний запрос и просто перечислите столбцыво внутреннем запросе
UPDATE #temp
SET ownernametwo = (SELECT defirstname + ' ' + delastname
FROM (SELECT row_number() OVER (ORDER BY depkey ASC) rownumber,
defirstname,
delastname
FROM debtor d
WHERE d.capkey = #temp.capkey
AND d.deisprimary <> 1) foo
WHERE rownumber = 1);
или оставьте конкатенацию во внутреннем псевдониме запроса, используя псевдоним us во внешнем запросе:
UPDATE #temp
SET ownernametwo = (SELECT fullname
FROM (SELECT row_number() OVER (ORDER BY depkey ASC) rownumber,
defirstname + ' ' + delastname fullname
FROM debtor d
WHERE d.capkey = #temp.capkey
AND d.deisprimary <> 1) foo
WHERE rownumber = 1);