题目
有如下一张表F0407
当001值是‘否’且002子项为‘空’时均不显示记录;
当001值是‘是’且002子项有记录时均不显示记录;
当001值是‘是’且002子项为‘空’时显示002该行空记录;
当001值是‘空’且002子项为‘空’时都显示记录;
最终理想的查询结果:
测试数据
CREATE TABLE F0407
(
ID INT,
CODE VARCHAR(10),
QUESTION VARCHAR(20),
ANSWER VARCHAR(10)
)
INSERT INTO F0407 VALUES
(1,'001','是否吸烟','否'),
(1,'002','吸烟年龄',NULL),
(2,'001','是否吸烟','是'),
(2,'002','吸烟年龄','18'),
(3,'001','是否吸烟','是'),
(3,'002','吸烟年龄',NULL),
(4,'001','是否吸烟',NULL),
(4,'002','吸烟年龄',NULL)
我的答案
with F0407Temp AS(
SELECT *
FROM F0407
WHERE CODE = '001' AND (ANSWER IS NULL OR ANSWER = '是')
)
select t1.*
from F0407 t1
inner join F0407Temp t2 on t2.id = t1.id
where t1.ANSWER is null
想法
我是这样想的,给的条件里要001为‘是’的或者为空的,那么我先找出这些数据,数据已经按ID分组好了,那么我直接查出001为‘是’的或者为空的行,取ID关联原表,再根据需要查002是空的条件,可以过滤掉001的行,就可得到查询结果。
这次的练习好像没有用的什么知识点函数,唯一有的可能就是WITH AS这个上图中F0407Temp 完全可以用with as 里面的内容代替掉,图中这样写只是方便观看。
WITH AS 函数用法的可以参考已有的大佬写的内容:数据库:SQLServer中with as 用法笔记_郝光明的博客-CSDN博客
结果