Вставка объединенного значения из определенной строки во временную таблицу в Transact SQL - PullRequest
1 голос
/ 17 апреля 2019

Я переписываю скрипт экспорта, который выполнялся в нашей старой плоской базе данных, в нашу новую нормализованную структуру. В прошлом у нас была таблица с именем Case, в которой было три столбца для информации об имени владельца - Ownername1, Ownername2 и Ownername3. Теперь у нас есть должники от нуля до многих, и вместо одной строки с тремя владельцами у нас есть строка для каждого владельца. Мне нужно втиснуть это в экспорт, который будет использоваться в электронной таблице Excel, которую использует клиент, но я должен «заглушить» структуру, чтобы вписать ее обратно в эту плоскую структуру. Мне нужно захватить имена владельцев первых трех строк и объединить имя и фамилию. Я поэкспериментировал с (SELECT ROW_NUMBER () OVER, и это похоже на решение, но я не могу заставить его работать должным образом в моем случае. Мне нужно не только объединить имена и фамилии, но и объединить чтобы очистить строку и вставить результат во временную таблицу. В нашей системе Case может иметь несколько должников. Первичный должник будет иметь значение DEIsPrimary, равное 1. CApKey - это ключевое значение дела.

Если я сделаю это, используя один столбец, я получу ожидаемый результат:

(SELECT DEPhone FROM 
(SELECT ROW_NUMBER() OVER (ORDER BY DEpKey ASC) 
AS rownumber, DEPhone FROM Debtor d WHERE d.CApKey = 151490 AND d.DEIsPrimary <> 1) 
AS foo WHERE rownumber = 1)

Возвращает действительный номер телефона. Когда я пытаюсь расширить это, используя составные имена, например, так:

(SELECT DEFirstName + ' ' + DELastName FROM 
(SELECT ROW_NUMBER() OVER (ORDER BY DEpKey ASC) 
AS rownumber, DEFIrstName + ' ' + DELastName FROM Debtor d WHERE d.CApKey = 151490 AND d.DEIsPrimary <> 1) 
AS foo WHERE rownumber = 1)

Я получаю две ошибки: мне говорят, что DEFirstName и DELastName являются недопустимыми именами столбцов, и мне также говорят, что для столбца 2 foo столбец не указан. Возможно ли объединение в этом контексте? Я пытался совмещать имена без удачи. Вот почти то, что мне нужно, но, как вы можете видеть, я еще даже не получил КОАЛЕСС. Вот моя первая попытка:

UPDATE #temp SET OwnerNameTwo = (SELECT DEFirstName + ' ' + DELastName FROM 
    (SELECT ROW_NUMBER() OVER (ORDER BY DEpKey ASC) 
    AS rownumber, DEFirstName + ' ' + DELastName
    FROM Debtor d WHERE d.CApKey = #temp.CApKey AND d.DEIsPrimary <> 1) 
    AS foo WHERE rownumber = 1)

Заранее благодарю за потраченное время, помогая мне с этим. Я действительно ценю любую обратную связь!

1 Ответ

0 голосов
/ 17 апреля 2019

Когда вы строите производную таблицу, вы не можете получить доступ к столбцам базовых таблиц напрямую, если они не появляются в списке после 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);
...