Как написать это в SQL? - PullRequest
       24

Как написать это в SQL?

0 голосов
/ 21 сентября 2009

У меня есть одна таблица под названием Визит, а другая - Измерение. Первичный ключ при посещении - это vis_id, а также внешний ключ в таблице Измерение. Теперь я хотел бы написать отчет на основе данных в таблице измерений при следующих условиях:

Посещение имеет поле "itemAmount". Я хочу иметь только данные, у которых itemAmount = 2 в таблице посещений, и обе строки в измерении, относящиеся к посещению, имеют измерение 1 и измерение 2, не равное нулю в таблице измерений. Если либо один из них имеет измерение1 или измерение2 NULL, то ни одна из строк не должна быть включена.

Как это сделать? Я знаю, как присоединиться и как написать простые условия в предложении where, но я понятия не имею, как проверить эту «особенность пары», то есть, чтобы проверить, что ОБА строки, связанные с Visit, имеют и measure1, и measure2, отличные от нуля.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2009

Предполагая, что ваши данные образца соответствуют указанным вами:

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

Это то, что вы хотите?

0 голосов
/ 21 сентября 2009

в качестве условия использования:

WHERE itemAmount = 2
  AND measurement1 IS NOT NULL
  AND measurement2 IS NOT NULL

(если я вас правильно понял)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...