我有一个名为Visit的表,另一个名为Measurement。 Visit上的主键是vis_id,它也是表Measurement中的外键。现在我想根据以下条件下的表测量数据编写一份报告:
访问包含字段“itemAmount”。我想只有表访问中具有itemAmount = 2的数据,并且Measurement中与Visit相关的两行中的measurement1和measurement2在表Measurement中都不为null。如果其中任何一个具有measurement1或measurement2 NULL,则不应包括任何行。
怎么做?我知道如何加入以及如何在where子句中编写简单条件,但我不知道如何测试这个“耦合特征”,即测试与Visit相关的两行同时测量1和测量2都与null不同。
答案 0 :(得分:0)
作为条件使用:
WHERE itemAmount = 2
AND measurement1 IS NOT NULL
AND measurement2 IS NOT NULL
(如果我理解正确的话)
答案 1 :(得分:0)
假设您的样本数据符合您的指定:
Visit:
vis_id itemAmounts
----------- -----------
1 2
2 1
Item:
item_id vis_id
----------- -----------
1 1
2 1
3 2
Measurement:
item_id measurement1 measurement2
----------- ------------ ------------
1 10 20
2 5 10
3 5 5
查询应该是这个:
select m1.*
from Measurement m1
join Item i1
on m1.item_id = i1.item_id
join Visit v
on v.vis_id = i1.vis_id
and v.itemAmounts = 2
join Item i2
on v.vis_id = i2.vis_id
and i1.item_id <> i2.item_id --//take the other item
join Measurement m2
on i2.item_id = m2.item_id
and m2.Measurement1 IS NOT NULL
and m2.Measurement2 IS NOT NULL
where m1.Measurement1 IS NOT NULL
and m1.Measurement2 IS NOT NULL
或者这个:
SELECT m1.*
FROM Measurement m1
JOIN Item i
ON m1.item_id = i.item_id
JOIN (SELECT v.vis_id
FROM Visit v
INNER JOIN Item i
ON i.vis_id = v.vis_id
INNER JOIN Measurement m
ON m.item_id = i.item_id
AND m.Measurement1 IS NOT NULL
AND m.Measurement2 IS NOT NULL
WHERE v.itemAmounts = 2
GROUP BY v.vis_id
HAVING COUNT(*) = 2
) v_filter
ON i.vis_id = v_filter.vis_id
两者都产生以下结果:
item_id measurement1 measurement2
----------- ------------ ------------
1 10 20
2 5 10
这就是你想要的吗?