SELECT
*,
p.name AS name,
p.image,
p.price,
(
SELECT ps.price
FROM product_special ps
WHERE p.id = ps.id
AND ps.date < NOW()
ORDER BY ps.priority ASC, LIMIT 1
) AS special_price,
(
SELECT ps.date
FROM product_special ps
WHERE p.id = ps.id
AND ps.date < NOW()
ORDER BY ps.priority ASC, LIMIT 1
) AS date
FROM product p LEFT JOIN product_special ps ON (p.id = ps.id)
Как вы можете видеть, я повторяю тот же подзапрос, чтобы вывести еще один столбец. Мне интересно, есть ли лучший способ сделать это?
id является первичным ключом в обеих таблицах. У меня нет проблем с созданием уникального product_special.priority, если это поможет.
cross apply
это доступно в Postgres , начиная с 9.3 (выпущена в 2013 году) , но они решили придерживаться стандарта SQL и использовать стандартныйlateral
оператор. Во втором запросе заменитеleft join
наleft join lateral
Попробуйте следующую команду SQL:
источник
LIMIT
и не помечен СУБД (так что это может быть MySQL или Postgres или SQLite или, возможно, некоторые другие базы данных). Код в ответе использует,OUTER APPLY
иTOP
поэтому он будет работать только в SQL Server (и Sybase), которые не имеютLIMIT
.OUTER APPLY
, но есть LATERAL , который должен быть эквивалентным. Пример его использования: stackoverflow.com/a/47926042/4850646Вдохновленный ответом Дезсо /dba//a/222471/127433 Я решаю проблему в PostgreSQL с помощью массивов, например:
По общему признанию это - только один столбец, но в моем коде я могу легко получить доступ к двум значениям. Надеюсь, это работает и для вас.
источник
Я просто хочу поставить это здесь в крайнем случае, для всех, кто использует движок базы данных, который не поддерживает один или несколько других ответов ...
Вы можете использовать что-то вроде:
(С разделителем или форматированием col1 и col2 до определенной длины.) А потом нарисуйте ваши данные, используя подстроки.
Я надеюсь, что кто-то найдет это полезным.
источник
В DB2 для z / OS используйте
pack
иunpack
функции для возврата нескольких столбцов в подвыбор.источник