Sql server 如何在SQL Server中从与映射表有联接的表中获取记录

Sql server 如何在SQL Server中从与映射表有联接的表中获取记录,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,如何从具有与映射表联接的表中获取记录 以下示例: 用户表格 ID | Name ---+------- 1 | ABC 2 | xyz 3 | NYS ID | Name ---+------ 1 | F1 2 | F2 3 | F3 4 | F4 ID | UserID | FeatureID ----+---------+---------- 1 | 1 | 1 2 | 1 | 2 3 | 2 | 2 4

如何从具有与映射表联接的表中获取记录

以下示例:

用户表格

ID | Name
---+-------
1  | ABC
2  | xyz
3  | NYS
ID | Name
---+------
1  | F1
2  | F2
3  | F3
4  | F4
ID  |  UserID | FeatureID
----+---------+----------
1   |    1    |    1
2   |    1    |    2
3   |    2    |    2
4   |    3    |    1
功能表

ID | Name
---+-------
1  | ABC
2  | xyz
3  | NYS
ID | Name
---+------
1  | F1
2  | F2
3  | F3
4  | F4
ID  |  UserID | FeatureID
----+---------+----------
1   |    1    |    1
2   |    1    |    2
3   |    2    |    2
4   |    3    |    1
映射表

ID | Name
---+-------
1  | ABC
2  | xyz
3  | NYS
ID | Name
---+------
1  | F1
2  | F2
3  | F3
4  | F4
ID  |  UserID | FeatureID
----+---------+----------
1   |    1    |    1
2   |    1    |    2
3   |    2    |    2
4   |    3    |    1
我需要这样的结果:

UserName | FeatureName |  IsMap 
---------+-------------+------------
ABC      |    F1       |   True
ABC      |    F2       |   True
ABC      |    F3       |   False
ABC      |    F4       |   False
XYZ      |    F1       |   False
XYZ      |    F2       |   True 
XYZ      |    F3       |   False
XYZ      |    F4       |   False
NYS      |    F1       |   True 
NYS      |    F2       |   False
NYS      |    F3       |   False
NYS      |    F4       |   False

请帮我解决这个问题。

首先将
用户
数据交叉连接到
功能
数据以获得所有组合。然后,您可以将
左键联接到
映射表中,以检查映射是否存在。如果返回一个
null
值,则没有匹配项,可以使用
大小写
表达式来处理:

declare @User table(ID int,Name nvarchar(100));
insert into @User values (1,'ABC'),(2,'xyz'),(3,'NYS');

declare @Feature table(ID int,Name nvarchar(100));
insert into @Feature values (1,'F1'),(2,'F2'),(3,'F3'),(4,'F4');

declare @Mapping table(ID int,UserID int,FeatureID int);
insert into @Mapping values (1,1,1),(2,1,2),(3,2,2),(4,3,1);

select u.Name as UserName
        ,f.Name as FeatureName
        ,case when m.ID is not null then 'True' else 'False' end as IsMap
from @User u
    cross join @Feature f
    left join @Mapping m
        on(u.ID = m.UserID
            and f.ID = m.FeatureID
            )
order by u.Name
        ,f.Name;
输出:

+----------+-------------+-------+
| UserName | FeatureName | IsMap |
+----------+-------------+-------+
| ABC      | F1          | True  |
| ABC      | F2          | True  |
| ABC      | F3          | False |
| ABC      | F4          | False |
| NYS      | F1          | True  |
| NYS      | F2          | False |
| NYS      | F3          | False |
| NYS      | F4          | False |
| xyz      | F1          | False |
| xyz      | F2          | True  |
| xyz      | F3          | False |
| xyz      | F4          | False |
+----------+-------------+-------+

到目前为止你试过什么?这是非常简单的SQL。