У меня есть одна таблица Profile, которая содержит только одно свойство.

profile_id  |  profile_name
    1               A
    2               B
   ...

У меня есть еще одна таблица, которая объединяет два Profiles из первой таблицы в одном месте

id    |    profile_id_1    |    profile_id_2
1               1                    2
2               1                    1    
...

Теперь я хотел бы запросить вторую таблицу, но с указанием фактических имен. Что-то типа:

Profile     |    Menu Access Group
   A                      B
   A                      A

Что я пробовал:

SELECT x.name as 'Profile', y.name as 'Menu Access Group'
FROM  
    (select * from profile_def 
        INNER JOIN profile_to_menu on profile_def_id = profile_id_1 ) as x,

    (select * from profile_def 
        INNER JOIN profile_to_menu on profile_def_id = profile_id_2 ) as y

Проблема в том, что возвращается UNION всего.

Как мне отфильтровать мою текущую попытку, чтобы вернуть только различия ids второй таблицы?

или более простой : как мне вернуть вторую таблицу с их Names вместо ids?

2
Luis Lavieri 8 Сен 2016 в 16:26

5 ответов

Лучший ответ

Выберите из profile_to_menu и присоединитесь дважды на profile_def, чтобы получить имена:

select p1.name as profile, p2.name as menu_access_group
  from profile_to_menu m
  join profile_def p1
    on p1.profile_def_id = m.profile_id_1
  join profile_def p2
    on p2.profile_def_id = m.profile_id_2
3
sstan 8 Сен 2016 в 13:30

Попробуй это:

DECLARE @tbl1 as TABLE(
    profile_id  INT,
    profile_name VARCHAR(50)
)

DECLARE @tbl2 as TABLE(
   Id  INT,
   profile_id_1  INT,
   profile_id_2  INT
)

INSERT INTO @tbl1 VALUES(1,'A')
INSERT INTO @tbl1 VALUES(2,'B')

INSERT INTO @tbl2 VALUES(1,1,2)
INSERT INTO @tbl2 VALUES(2,1,1)

SELECT
    T1_1.profile_name AS 'Profile',
    T1_2.profile_name AS 'Menu Access Group'
FROM @tbl2 T2
LEFT JOIN @tbl1 T1_1 ON T1_1.profile_id=T2.profile_id_1
LEFT JOIN @tbl1 T1_2 ON T1_2.profile_id=T2.profile_id_2
1
Sandip - Full Stack Developer 8 Сен 2016 в 13:32

Вам нужно всего лишь две операции INNER JOIN:

SELECT t2.profile_name, t3.profile_name
FROM Profile_to_menu AS t1
INNER JOIN Profile_def AS t2 ON t1.profile_id_1 = t2.profile_id
INNER JOIN Profile_def AS t3 ON t1.profile_id_1 = t3.profile_id

Первое соединение используется для получения имени первого профиля, а второе соединение используется для получения имени второго.

2
Giorgos Betsos 8 Сен 2016 в 13:30
select  
  p1.profile_name, 
  p2.profile_name 
from profiles
  join profile p1 on p1.profile_id = profiles.profile_id_1
  join profiles p2 on p1.profile_id = profiles.profile_id_2
0
scsimon 8 Сен 2016 в 13:53

Решите это использование следующим образом

SELECT T11.name as 'Profile', T12.name as 'Menu Access Group'
FROM TABLE2 AS T2
JOIN TABLE1 AS T11 ON T11.profile_id_1=T2.profile_id  
JOIN TABLE1 AS T12 ON T12.profile_id_2=T2.profile_id  

Я надеюсь, что эта работа отлично. попытайся.

0
TAMIL ARASAN 8 Сен 2016 в 14:00