查询“映射表”以返回一组特定结果,这些结果包含SQL中的一组特定选项

时间:2017-03-01 10:12:34

标签: sql-server

如果问题是通用的,我很抱歉,有时很难定义标题。

所以,基本上,我在SQL中有3个表:

  • 一个机器表(id,Name,Description
  • 一个OPTIONS表(id, Description
  • MAPPING表(id, id_machine, id_option),它基本上告诉哪些机器包含哪些选项

因此,在某些时候,在我正在开发的应用程序中,用户选择他想要的选项。现在我需要采用这些选项,并以某种方式查询MAPPING表并仅返回包含这些选项的计算机。

映射表示例:

id | id_opt | id_mach
---+--------+---------    
1  |  Opt1  |  Mach1
2  |  Opt2  |  Mach1
3  |  Opt3  |  Mach1
4  |  Opt4  |  Mach1
5  |  Opt1  |  Mach2
6  |  Opt3  |  Mach2
7  |  Opt9  |  Mach3
8  |  Opt11 |  Mach3

想象一下,用户选择Opt1, Opt3 and Opt4。在这种情况下我需要返回,例如,只有Mach1。

我已经尝试在INNER JOIN中选择了id_opt的3个表之间创建了两个{{1}}但是它没有被机器区分,它返回包含至少一个用户的所有机器选项。

1 个答案:

答案 0 :(得分:3)

SELECT id_mach
FROM MAPPING
WHERE id_opt IN ('Opt1', 'Opt3', 'Opt4')
GROUP BY id_mach
HAVING COUNT(DISTINCT id_opt) = 3

如果您还需要机器名称和说明,请进行联接以获取该信息:

SELECT t1.Name, t1.Description
FROM MACHINE t1
INNER JOIN
(
    SELECT id_mach
    FROM MAPPING
    WHERE id_opt IN ('Opt1', 'Opt3', 'Opt4')
    GROUP BY id_mach
    HAVING COUNT(DISTINCT id_opt) = 3
) t2
    ON t1.id = t2.id_mach