Комментарий Освальда относительно порядка (или его отсутствия) строк очень важен.У вас нет garuntee, period , что несортированные строки, выбранные из этой таблицы, будут в ожидаемом вами порядке.Это означает, что если вы не укажете существующий в табличном порядке каждый раз , вещи могут быть помечены «КАК ВЫШЕ», даже если это не отражает реальность.Кроме того, ни одно из предоставленных решений до настоящего времени не будет правильно работать с какими-либо несоответствующими записями.
В целом, это больше похоже на проблему проектирования базы данных (в частности, на проблему нормализации), чем на проблему запроса.
В идеале, описания должны быть извлечены в некоторый мастер данных (вместе с необходимыми идентификаторами).Затем выбор используемого описания остается за выполнением команды SELECT.Это дает дополнительное преимущество, заключающееся в обеспечении безопасности «КАК ВЫШЕ» для изменений в упорядочении.
Таким образом, если предположить, что каждый экземпляр столбца order_ref должен иметь свое описание (за исключением бита «ВЫШЕ»),Таблицы могут быть реорганизованы следующим образом:
id | order_ref | price
=======================
1 | 34567 | 19.99
2 | 34567 | 13.99
и
order_ref_fk | description
==========================================
34567 | "This is the description"
На этом этапе вы обычно присоединяетесь к таблице описания.Отображение другого описания, как правило, является проблемой display независимо от того, решается ли она любой программой, которая выводит строки для отображения (не непосредственно в базе данных).
Если вы настаиваете на этомin-db, вы можете написать SELECT
в таком ключе:
SELECT Orders.id, Orders.order_ref, Orders.price,
COALESCE(Dsc.description, 'AS ABOVE')
FROM Orders
LEFT JOIN (Description
JOIN (SELECT order_ref, MIN(id) AS id
FROM Orders
GROUP BY order_ref) Ord
ON Ord.order_ref = Description.order_ref_fk) Dsc
ON Dsc.order_ref_fk = Orders.order_ref
AND Dsc.id = Orders.id
ORDER BY Orders.order_ref, Orders.id