|
|
|
Группировка символьных значений в одну строку?!?
|
|||
|---|---|---|---|
|
#18+
Может кто подскажет: Есть таблица People - сотрудники, а также 2-ая таблица Child - дети. Вопрос: Можно ли получить запросом детей сотрудника в одну строчку? Примерно так: ....1 поле................2 поле....... Сотрудник 1........Сын, Сын, Дочь Сотрудник 2........Сын, Дочь .. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2002, 22:18:44 |
|
||
|
Группировка символьных значений в одну строку?!?
|
|||
|---|---|---|---|
|
#18+
Можно. С большими ограничениями и накладными расходами. Например, мой пример работает, если максимальное количество детей не больше трех: CREATE TABLE #Employees (emp_id INT, emp_name VARCHAR(50)) CREATE TABLE #Children (child_id INT IDENTITY(1,1), emp_id INT, status VARCHAR(4), child_name VARCHAR(50)) INSERT INTO #Employees VALUES (1, 'Иванов') INSERT INTO #Employees VALUES (2, 'Петров') INSERT INTO #Employees VALUES (3, 'Сидоров') INSERT INTO #Children (emp_id, status, child_name) VALUES (1, 'сын', 'Вася') INSERT INTO #Children (emp_id, status, child_name) VALUES (1, 'сын', 'Петя') INSERT INTO #Children (emp_id, status, child_name) VALUES (1, 'дочь', 'Маня') INSERT INTO #Children (emp_id, status, child_name) VALUES (2, 'сын', 'Коля') INSERT INTO #Children (emp_id, status, child_name) VALUES (2, 'дочь', 'Оля') INSERT INTO #Children (emp_id, status, child_name) VALUES (3, 'сын', 'Боря') SELECT emp_name AS [кормильцы], CH1.child_id AS [CH1], CH2.child_id AS [CH2], CH3.child_id AS [CH3], RTRIM(ISNULL(CH1.child_name, '') + ' ' + ISNULL(CH2.child_name, '') + ' ' + ISNULL(CH3.child_name, '')) AS [нахлебники] FROM #Employees EMP LEFT JOIN #Children CH1 ON EMP.emp_id = CH1.emp_id LEFT JOIN #Children CH2 ON EMP.emp_id = CH2.emp_id AND CH1.child_id < CH2.child_id LEFT JOIN #Children CH3 ON EMP.emp_id = CH3.emp_id AND CH1.child_id < CH2.child_id AND CH2.child_id < CH3.child_id WHERE ISNULL(CH1.child_id, 0) + ISNULL(CH2.child_id, 0) + ISNULL(CH3.child_id, 0) = (SELECT SUM(child_id) FROM #Children WHERE emp_id = EMP.emp_id) DROP TABLE #Employees DROP TABLE #Children С другой стороны, запрос достаточно детерминирован - можно написать процедуру, выбирающую по максимальному количеству детей ту или иную конструкцию запроса. IMHO, такие вещи по возможности лучше делать: 1) на клиенте: Два набора записей (сотрудники, дети) с прокруткой только вперед и отсортированные по сотрудникам (чтобы можно было двигать курсоры по соответствующим записям); и третий несвязанный набор, в который пишутся результаты обработки - его можно подвязать к гриду. 2) на сервере, но с курсорами по алгоритму 1), вместо третьего набора - временная таблица. 3) поддерживать целевое поле в таблице сотрудников тригерами таблицы с детьми. - Я бы выбрал этот способ. P.S. Я там специально подкрасил красненьким один из LEFT`ов: так запрос выводит всех сотрудников. Если заменить его на INNER, то только сотрудников, имеющих детей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2002, 07:39:21 |
|
||
|
Группировка символьных значений в одну строку?!?
|
|||
|---|---|---|---|
|
#18+
если SQL2000 то пишите код в пользовательскую функцию: Код: plaintext 1. 2. 3. 4. 5. 6. потом её пользуете в запросе Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2002, 09:00:44 |
|
||
|
Группировка символьных значений в одну строку?!?
|
|||
|---|---|---|---|
|
#18+
Зёма ~Bazul~, не совсем понял, что Вы хотели сказать своим кодом: как в UDF детишки-то (ну бывает их больше одного в одной семье - что тут поделать) собираются в одной переменной? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2002, 09:14:26 |
|
||
|
Группировка символьных значений в одну строку?!?
|
|||
|---|---|---|---|
|
#18+
Но идея с UDF в ситуации, когда ни клиента ни тригера для одного запроса ваять неохота - хороший выход. Типа: CREATE FUNCTION GetChild(@father INT) RETURNS VARCHAR(300) AS BEGIN DECLARE @child_name VARCHAR(50), @children VARCHAR(300) DECLARE children_cur CURSOR FORWARD_ONLY FOR SELECT child_name FROM Children WHERE emp_id = @father OPEN children_cur SET @children = '' FETCH NEXT FROM children_cur INTO @child_name WHILE @@FETCH_STATUS = 0 BEGIN SET @children = @children + ' ' + @child_name FETCH NEXT FROM children_cur INTO @child_name END DEALLOCATE children_cur SET @children = LTRIM(@children) RETURN @children END ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2002, 09:33:44 |
|
||
|
Группировка символьных значений в одну строку?!?
|
|||
|---|---|---|---|
|
#18+
2 Dominic что по Вашему вернет этот скрипт? :) Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2002, 10:18:00 |
|
||
|
Группировка символьных значений в одну строку?!?
|
|||
|---|---|---|---|
|
#18+
to Dominic не совсем понял, что Вы хотели сказать своим кодом: как в UDF детишки-то (ну бывает их больше одного в одной семье - что тут поделать) собираются в одной переменной? Так запусти скрипт, и посмотри как все детишки соберутся в одной строке. :-)) На самом деле они вначале собираются в переменнной @child_s. Болле чем очевидно, что в задачке СуперСержа вернется строка, состоящая из стольки звездочек, сколько строк в таблице sysobjects. Неверующие_фомы могут проверить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2002, 11:01:04 |
|
||
|
Группировка символьных значений в одну строку?!?
|
|||
|---|---|---|---|
|
#18+
Осознал! Каюсь! Беру на вооружение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2002, 12:53:56 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32042405&tid=1821163]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
25ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 191ms |
| total: | 284ms |

| 0 / 0 |
