T-SQL内部联接

T-SQL内部联接,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个Profile表,它只包含一个属性 profile_id | profile_name 1 A 2 B ... 我还有一个表,它将第一个表的两个配置文件组合在一个地方 id | profile_id_1 | profile_id_2 1 1 2 2 1

我有一个
Profile
表,它只包含一个属性

profile_id  |  profile_name
    1               A
    2               B
   ...
我还有一个表,它将第一个表的两个
配置文件组合在一个地方

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

如何筛选当前尝试只返回第二个表的distincts
id


或更简单:如何返回第二个表及其
名称
,而不是
id

profile\u to\u菜单中选择
,并在
profile\u 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

您只需要两个
内部联接
操作:

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
第一个联接用于获取第一个配置文件的名称,而第二个联接用于获取第二个配置文件的名称。

尝试以下操作:

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

解决这个问题的方法如下

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  

我希望这项工作顺利进行。试试看。

你做了一个交叉连接,那么你期待什么呢?永远不要使用隐式连接。它们是SQL反模式。也不要使用select*,因为这也是一种非常糟糕的做法。
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