SQL:选择性子查询

Jel*_*ela 3 sql conditional subquery

我正在使用SQL查询(MSSQLSERVER),我使用子选择向结果集添加列:

SELECT P.name, 
(select count(*) from cars C where C.type = 'sports') AS sportscars,
(select count(*) from cars C where C.type = 'family') AS familycars,
(select count(*) from cars C where C.type = 'business') AS businesscars
FROM people P
WHERE P.id = 1;
Run Code Online (Sandbox Code Playgroud)

上面的查询只是来自一个有点废话的测试设置,但它的功能足够好我想的例子.我实际上正在处理的查询跨越了许多复杂的表,这些表只会分散手头的问题.

在上面的示例中,表"people"中的每个记录还有三个附加列:"wantsSportscar","wantsFamilycar"和"wantsBusinesscar".现在我想要做的只是如果people表中相应的"want ....."字段设置为"true",则执行每个附加列的子选择.换句话说,如果P.wantsSportscar对于特定的人设置为true,我只想做第一个子选择.第二和第三个子选择应该以类似的方式工作.

因此,此查询应该起作用的方式是它显示特定人员的姓名以及他想要拥有的汽车类型可用的模型数量.值得注意的是,我的最终结果集将始终只包含一个记录,即一个特定用户的记录.

重要的是,如果一个人对某种类型的汽车不感兴趣,那么该类型的列将不包括在最终结果集中.一个例子可以肯定这一点很清楚:

如果A人想要跑车和家用车,结果将包括"名称","跑车"和"家庭车"栏.

如果B人想要商务车,结果将包括"名称"和"商务车"列.

我一直在尝试使用IF,CASE和EXISTS语句的各种组合,但到目前为止,我还没有能够得到语法上正确的解决方案.有谁知道这是否可能?请注意,查询将存储在存储过程中.

Qua*_*noi 5

在您的情况下,可能有8列布局,为此,您将需要8单独的查询(或动态构建您的查询).

无法在单个查询中更改结果集布局.

相反,您可以按如下方式设计查询:

SELECT  P.name, 
        CASE WHEN wantssport = 1 THEN (select count(*) from cars C where C.type = 'sports') ELSE NULL END AS sportscars,
        CASE WHEN wantsfamily = 1 THEN (select count(*) from cars C where C.type = 'family') ELSE NULL END AS familycars,
        CASE WHEN wantsbusiness = 1 THEN (select count(*) from cars C where C.type = 'business') ELSE NULL END AS businesscars
FROM    people P
WHERE   P.id = 1
Run Code Online (Sandbox Code Playgroud)

NULL如果一个人不想要它,将在适当的列中选择,并NULL在客户端解析这些.

请注意,关系模型以方式回答查询relations.

在你的情况下,关系如下:"这个人需要满足这么多的跑车,这很多商务车和这么多家用车".

关系模型总是以四元关系回答这个特定问题.

它不省略任何关系成员:不是,它只是将其设为NULL这是SQL的方式来表明一个关系的成员没有定义,适用或有意义的.