gpt4 book ai didi

SQL:选择性子查询

转载 作者:行者123 更新时间:2023-12-04 23:43:41 25 4
gpt4 key购买 nike

我有一个 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;

上面的查询只是来自一个有点废话的测试设置,但它作为我认为的例子已经足够了。我实际处理的查询跨越了许多复杂的表,这些表只会分散对手头问题的注意力。

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

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

重要的是,如果一个人对某种类型的汽车不感兴趣,则该类型的列将不会包含在最终结果集中。一个例子来确定这是清楚的:

如果 A 想要一辆跑车和一辆家用车,结果将包括“名称”、“跑车”和“家用车”列。

如果 B 想要一辆商务车,结果将包括“名称”和“商务车”列。

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

最佳答案

在你的情况下,有 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

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

请注意,关系模型根据 relations 回答查询。 .

在你的情况下,关系如下:“这个人的需求得到了这么多跑车、这么多商务车和这么多家用车的满足”。

关系模型总是用四元关系来回答这个特定的问题。

它不会省略任何关系成员:相反,它只是将它们设置为 NULL这是 SQL的方式来表明关系的成员未定义、适用或有意义。

关于SQL:选择性子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1012237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com