вторник, 8 января 2008 г.

Женский SQL

Старый анекдот: мужчины считают, что вероятность встретить динозавра на улице одна миллионная; а женщины - что вероятность одна вторая ("или встречу, или не встречу"). Самое интересное, что многие женщины действительно так думают, проверено.

К чему это я вспомнил: Марине надо было вывести список пациентов, у которых после операции возникло такое-то, такое-то или такое-то осложнение (complication). Промучалась полдня, и не получилось. Вечером спросила моего совета.

- Так а в чем проблема? Это же простой запрос, ты же уже писала запросы и посложнее. А здесь просто одна таблица, фильтруешь ее по ComplicationId
- Не получается
- Может, случайно лишний OR в конце влепила?
- Нет, работает, но выдает пустой результат.
- А! Наверное, ты перепутала, и делаешь ComplicationId = 1 AND ComplicationId = 2 AND ComplicationId = 3 вместо ComplicationId = 1 OR ComplicationId = 2 OR ComplicationId = 3 ?
- Ну да! Я же хочу в результате выполнение запроса получить список пациентов, у которых И такое осложнение, И такое, И такое. Значит, AND.

Я вспомнил про динозавра и расхохотался. А потом подумал - а ведь и правда, логика в марининых словах есть. Вся фишка в том, что в SQL мы пишем WHERE с точки зрения кортежа (т.е. одной строчки), а человеку привычнее думать обо всем получаемом множестве строк.

2 комментария:

Анонимный комментирует...

Если нужно найти пациентов у которых возникло И такое И такое осложнение (одновременно), то OR работать не будет. 8-)

Valiki комментирует...

Да, я недосточно точно описал проблему.

Есть всего одна таблица, в которой данные о пациенте и его ComplicationId. Естественно, правильнее было бы создать таблицы Пациенты и ОсложненияПациентов, но это не было сделано предыдущими разработчиками. Как они объяснили, в их случае "такое почти не бывает". Т.е. предпологается что у одного и того же человека не бывает двух разных осложнений.

Ratings by outbrain