помогите написать запрос SQL, чтобы присоединиться к таблице - PullRequest
0 голосов
/ 17 декабря 2010

У меня есть SQL-запрос, который возвращает таблицу, подобную следующей:

id  emp_name    total_explabor_grade    title       name
518 Name,One    3   PE4 Software Engineer   Java
492 Name,Two    4   PE1 Software Engineer   Java
502 Name,Three  1   SPE5    Principal       Javascript
410 Name,Four   3   ENG3    Software Engineer   Java
147 Name,Five   5   SPE5    Director        Java
147 Name,Five   2   SPE5    Director        Javascript
156 Name,Six    10  PE2 Senior          Java
156 Name,Six    8   PE2 Senior          Javascript

Этот запрос основан на запросах людей, обладающих навыками Java ИЛИ Javascript.Как вы можете видеть, сотрудники 147 и 156 имели успех как для Java, так и для Javascript.

Если я сохраняю текущий запрос во временную таблицу, скажите # TempTable

Какой запрос можно запуститьна #TempTable, чтобы дать мне результат, подобный этому:

id  emp_name    total_explabor_grade    title       name
518 Name,One    3   PE4 Software Engineer   Java
492 Name,Two    4   PE1 Software Engineer   Java
502 Name,Three  1   SPE5    Principal       Javascript
410 Name,Four   3   ENG3    Software Engineer   Java
147 Name,Five   5,2 SPE5    Director        Java,Javascript
156 Name,Six    10,8    PE2 Senior          Java,JavaScript

Я пытался сделать соединение #TempTable с самим собой в различных формах, но я не смог получить его, чтобы дать мне таблицу, какчто я только что опубликовал.Это код, который я написал до сих пор ...

select t1.id, t1.emp_name, CONVERT(nvarchar(3),t1.total_exp)+','+CONVERT(nvarchar(3),t2.total_exp), t1.labor_grade, t1.title, t1.name+','+t2.name AS hits
from #TempTable t1 JOIN #TempTable t2
 ON t1.id=t2.id

Кто-нибудь знает, возможно ли объединение, как я этого хочу?Мое последнее мнение состоит в том, что потребуется более одного выбора, но я не совсем понял,

Ответы [ 3 ]

2 голосов
/ 17 декабря 2010

Может быть, вы можете придумать решение, набрав group_concat

Сгруппируйте по одинаковым столбцам имя сотрудника и group_concat по другим, которые хотите объединить.

0 голосов
/ 17 декабря 2010

Это не самостоятельное задание, потому что вам придется присоединиться к столу за один раз для каждого возможного навыка.Если максимальное количество возможных навыков для сотрудника известно заранее и достаточно мало, вы можете начать подходить к нему с самостоятельным объединением, но это вряд ли будет правдой.(С другой стороны, если количество навыков действительно гарантировано будет только Java и Javascript и ничем иным, вы можете сделать это с помощью самостоятельного объединения или даже более простого MIN / MAX GROUP BY).

На самом деле это проблема агрегирования, которая должна быть решена с помощью запроса GROUP BY.К сожалению, SQL Server не имеет встроенной функции агрегирования конкатенации строк (как и MySQL и некоторые другие продукты).Вы можете аппроксимировать его несколькими различными способами (CTE или For XML), другие респонденты имеют связанные статьи, демонстрирующие эти методы.

0 голосов
/ 17 декабря 2010

Это невозможно при самостоятельном объединении, основанном на ваших данных, потому что у ваших строк нет уникального ключа.Чтобы самостоятельное объединение было возможным, вам нужно запретить соединение строки с самим собой.Из-за этого ваш запрос фактически вернул бы 2 строки для идентификатора 147.

Простой способ сделать это - запрос, который выбирает различные идентификаторы и имена из temptable, а затем использует 4 функции, которые возвращаютобъединенная строка всех вхождений лет, класса труда, звания и навыков для удостоверения личности.

...