SQL Server 2008. Возьмите информацию из двух таблиц и объедините значения строк.

Я посмотрел на то, что было помечено как дубликат этого, и это не так. Я беру с двух столов, а не с одного.

Во-первых, позвольте мне сказать, что я не имел никакого отношения к разработке этой базы данных.

У меня есть две таблицы, которые нужно соединить, а затем неизвестное количество строк, в которых данные должны быть объединены в одну гигантскую строку. Они объединены идентификатором записи.

Таблица Элемент:

Item         RecordID
---------------------
Car A        123
Car B        456
Car C        789

Да, слова буквально обрываются на середине. Между значениями не должно быть ничего добавлено, и мне также нужно сохранить запятые и другие специальные символы.

Таблица Подробности:

RecordID     Details
--------------------------------
123          black pain
123          t, radials
123          , green le
123          ather, spo
123          rt steerin
123          g wheel, b
123          uilt-in GP
123          S
456          standard
789          black leat
789          her, teles
789          coping ste
789          ering whee
789          l, seven c
789         up holders
789         , heavy du
789         ty mudflap
789         s

В итоге я хочу получить следующее:

ItemID       RecordID     Details
----------------------------------------------------------------------------
Car A        123          black paint, radials, green leather, sport steering wheel, built-in GPS
Car B        456          standard       
Car C        789          black leather, telescoping steering wheel, seven cup holders, heavy duty mudflaps

Я просмотрел все XML и не могу понять, как это сделать.

Заранее спасибо.


person BethD    schedule 09.10.2018    source источник
comment
Если у вас нет других столбцов, то у вас проблема. Данные SQL по своей природе неупорядочены, невозможно узнать, в каком порядке объединять записи, без другого столбца, по которому они упорядочиваются.   -  person MatBailie    schedule 10.10.2018
comment
для полноты на случай, если кто-то найдет здесь свой путь: в SQL Server 2017 есть STRING_AGG   -  person Mitch Wheat    schedule 10.10.2018


Ответы (1)


Нет никакой гарантии, что ваш STUFF/ FOR XML PATH даст результаты, которые вы запрашиваете, если у вас нет поля IDENTITY в вашей таблице Details или какого-либо другого значения, которое вы можете отсортировать, что заставит порядок текста Details.

Обычно вы можете использовать команду STUFF с оператором ORDER BY.

SELECT
  Item.Item AS ItemID,
  Item.RecordID,
  STUFF( (
           SELECT
             '' + Details
           FROM
             Details
           WHERE
             Details.RecordID = Item.RecordID
             -- ORDER BY SomeLineIndicator
           FOR XML PATH ('')
         ), 1, 0, '' ) AS Details
FROM
  Item

Я попробовал это на своем поле без ORDER BY и так получилось, что получил результат, о котором вы просите, но вы действительно не можете полагаться на эти результаты без поля, которое вы можете использовать для принудительного заказа.

Прочтите этот пост и статьи по ссылкам, чтобы узнать, зачем вам нужно поле для этого и почему вы не можете полагаться на неопределенный внутренний «индекс», который позаботится об этом за вас: Порядок строк по умолчанию в запросе SELECT - SQL Server 2008 и SQL 2012

person Paurian    schedule 09.10.2018
comment
Есть поле, где я могу их заказать. Спасибо Спасибо спасибо. Я проклинаю человека, который создал вторую таблицу! - person BethD; 10.10.2018