如何在SQL中编写这个?

时间:2009-09-21 10:14:01

标签: sql transactions

我有一个名为Visit的表,另一个名为Measurement。 Visit上的主键是vis_id,它也是表Measurement中的外键。现在我想根据以下条件下的表测量数据编写一份报告:

访问包含字段“itemAmount”。我想只有表访问中具有itemAmount = 2的数据,并且Measurement中与Visit相关的两行中的measurement1和measurement2在表Measurement中都不为null。如果其中任何一个具有measurement1或measurement2 NULL,则不应包括任何行。

怎么做?我知道如何加入以及如何在where子句中编写简单条件,但我不知道如何测试这个“耦合特征”,即测试与Visit相关的两行同时测量1和测量2都与null不同。

2 个答案:

答案 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

这就是你想要的吗?