Выбор нескольких значений из одного столбца - PullRequest
1 голос
/ 20 февраля 2020

У меня есть следующая таблица:

att_id | user_id | att_name  | att_value
1      | 202     | first_name| Cris    
2      | 202     | last_name | Williams
3      | 202     | email     | cwill122@yahoo.com

Я хочу вернуть таблицу типа:

202  | Chris | Wiliams | cwill122@yaoo

Ответы [ 6 ]

1 голос
/ 20 февраля 2020

Вы можете сделать условную агрегацию. Это канонический способ поворота набора данных:

select 
    user_id,
    max(case when att_name = 'first_name' then att_value end) first_name,
    max(case when att_name = 'last_name'  then att_value end) last_name,
    max(case when att_name = 'email'      then att_value end) email
from mytable
group by user_id
0 голосов
/ 20 февраля 2020
select 
    I.user_id,A.fname, B.lname, C.email
    from 
    (select distinct user_id from AttTable) I
    left join 
    (select user_id, att_value as fname from AttTable where att_name = 'first_name') A
    on I.user_id =  A.user_ID
    left join
    (select user_id, att_value as lname from AttTable where att_name = 'last_name') B
    on I.user_id = B.user_id
    left join 
    (select user_id, att_value as email from AttTable where att_name = 'email') C
    on I.user_id = C.user_id 
0 голосов
/ 20 февраля 2020

Вы можете использовать PIVOT (MSSQL / T SQL).

WITH PivotData AS
(
    SELECT user_id, att_name, att_value FROM dbo.AttTable
)
SELECT user_id, first_name, last_name, email
FROM PivotData
    PIVOT(MAX(att_value) FOR att_name IN(first_name, last_name, email)) AS P;

Тестовые данные

CREATE TABLE dbo.AttTable
(
    att_id INT NOT NULL,
    user_id INT NOT NULL,
    att_name VARCHAR(50) NOT NULL,
    att_value VARCHAR(50) NOT NULL,
    PRIMARY KEY (att_id, user_id)
);

INSERT INTO dbo.AttTable
    (att_id, user_id, att_name, att_value)
VALUES
    (1, 202, 'first_name', 'Cris'),
    (2, 202, 'last_name', 'Williams'),
    (3, 202, 'email', 'cwill122@yahoo.com')
0 голосов
/ 20 февраля 2020

Сохраните user_id в переменной (скажем, uid), а затем возьмите first_name, last_name, email uid в других переменных. Тогда вы можете вставить их в новую таблицу. Или вы можете использовать соединение, чтобы выполнить работу и создать представление для использования в будущем.

0 голосов
/ 20 февраля 2020

Вам нужно самостоятельно присоединиться к таблице, присвоив ей псевдонимы.

SELECT t1.att_value, t2.att_value, t3.att_value FROM [имя таблицы] t1 JOIN [имя таблицы] t2 ON t1.att_id = t2.att_id JOIN [имя таблицы] t3 ON t3.att_id = t1.att_id ГДЕ user_id = 202

0 голосов
/ 20 февраля 2020

Мой совет - поместить поля att_name att_value в другую таблицу и сделать join

...