Size: a a a

DBA - русскоговорящее сообщество

2021 March 12

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
NoName
Привет. Подскажите, если создается внешний ключ, он не индекс? Надо ли отдельно создавать индекс на поле если это поле уже внешний ключ?
База postgresql
Привет. Подскажите, если создается внешний ключ, он не индекс?|

В дочерней таблице — нет.

Надо ли отдельно создавать индекс на поле если это поле уже внешний ключ?
Это зависит от обстоятельств, и, в принципе, решается независимо от наличия FK constraint.

То есть если будут запросы на эту таблицу по этому полю, и индекс будет полезен — можно создать.
Но можно и не создавать — для работы FK индекс не нужен (не берём в расчёт FK с каскадными делитами и апдейтами, это отдельный случай).
источник

AK

Alex K in DBA - русскоговорящее сообщество
Есть бд. Столбцы стадион, дата игры. Надо найти промежуток между последней и предпоследней игрой на каждом стадионе. Это подзапросы гуглить?
источник

V

Vitor in DBA - русскоговорящее сообщество
Alex K
Есть бд. Столбцы стадион, дата игры. Надо найти промежуток между последней и предпоследней игрой на каждом стадионе. Это подзапросы гуглить?
Да, и, возможно, алиасы
источник

oa

oleg aronov in DBA - русскоговорящее сообщество
Alex K
Есть бд. Столбцы стадион, дата игры. Надо найти промежуток между последней и предпоследней игрой на каждом стадионе. Это подзапросы гуглить?
По описанию похоже на оконные функции
источник

Э

Эдуард in DBA - русскоговорящее сообщество
источник

TS

Tim Safari in DBA - русскоговорящее сообщество
Alex K
Есть бд. Столбцы стадион, дата игры. Надо найти промежуток между последней и предпоследней игрой на каждом стадионе. Это подзапросы гуглить?
Lag/Lead + top и сортировка
источник

N

NoName in DBA - русскоговорящее сообщество
Ilia Zviagin
Привет. Подскажите, если создается внешний ключ, он не индекс?|

В дочерней таблице — нет.

Надо ли отдельно создавать индекс на поле если это поле уже внешний ключ?
Это зависит от обстоятельств, и, в принципе, решается независимо от наличия FK constraint.

То есть если будут запросы на эту таблицу по этому полю, и индекс будет полезен — можно создать.
Но можно и не создавать — для работы FK индекс не нужен (не берём в расчёт FK с каскадными делитами и апдейтами, это отдельный случай).
Спасибо
источник

AK

Alex K in DBA - русскоговорящее сообщество
Спасибо
источник

VS

Vitaliy Sheverov in DBA - русскоговорящее сообщество
Ребята, есть вот такой запрос

`SELECT p.product_id,
      MIN(vps.price)                                                            as special,
      MIN(v.price)                                                              as price,
      v.product_id                                                              as variant_product_id,
      vps.product_special_id
FROM oc_product p
        LEFT JOIN oc_product v ON (v.main_id = p.product_id AND v.type = 2)
        LEFT JOIN oc_product_special as vps ON (vps.product_id = v.product_id AND vps.customer_group_id = '1' AND
                                                (vps.date_start < NOW() AND
                                                 (vps.date_end IS NULL OR vps.date_end > NOW())))
WHERE p.status = '1'
 AND p.date_available <= NOW()
 AND p.type = 0
GROUP BY p.product_id
ORDER BY case when special is null then 2 else 1 end
`

но в результате вот такое, такое впечетление, что на order by оно не обращает внимания никакого
источник

У

Уруруборос Иванович... in DBA - русскоговорящее сообщество
Order by special nulls last попробуй
источник

У

Уруруборос Иванович... in DBA - русскоговорящее сообщество
Vitaliy Sheverov
Ребята, есть вот такой запрос

`SELECT p.product_id,
      MIN(vps.price)                                                            as special,
      MIN(v.price)                                                              as price,
      v.product_id                                                              as variant_product_id,
      vps.product_special_id
FROM oc_product p
        LEFT JOIN oc_product v ON (v.main_id = p.product_id AND v.type = 2)
        LEFT JOIN oc_product_special as vps ON (vps.product_id = v.product_id AND vps.customer_group_id = '1' AND
                                                (vps.date_start < NOW() AND
                                                 (vps.date_end IS NULL OR vps.date_end > NOW())))
WHERE p.status = '1'
 AND p.date_available <= NOW()
 AND p.type = 0
GROUP BY p.product_id
ORDER BY case when special is null then 2 else 1 end
`

но в результате вот такое, такое впечетление, что на order by оно не обращает внимания никакого
Как я понял, нельзя в выражениях использовать выражения из селекта. Поидее должна быть ошибка, но на кейс её нет видимо. Попробуй в подзапрос обернуть или как я выше написал
источник

У

Уруруборос Иванович... in DBA - русскоговорящее сообщество
Или вместо special написать min из селекта
источник

ДМ

Дмитрий Мачихелян... in DBA - русскоговорящее сообщество
Подскажите как составить запрос. Есть у меня запрос:
create or replace view contacts_count as 
select contacts.user_id, count(contacts.user_id)
from contacts
group by contacts.user_id
Вот мне нужно сделать так, чтобы в этот запрос подать массив idшников и по ним собирать count. Также в этом массиве могут быть айдишники, которых нет в таблице, но в представлении нужно их отображать с count = 0
источник

VS

Vitaliy Sheverov in DBA - русскоговорящее сообщество
Уруруборос Иванович
Order by special nulls last попробуй
запрос выдает ошибку синтаксиса, раньше такого не испольозовал. Вы правильно строчку з кодом написали?

И да, спасибо, в order все же надо выражение прописать, а не результат
источник

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
Vitaliy Sheverov
Ребята, есть вот такой запрос

`SELECT p.product_id,
      MIN(vps.price)                                                            as special,
      MIN(v.price)                                                              as price,
      v.product_id                                                              as variant_product_id,
      vps.product_special_id
FROM oc_product p
        LEFT JOIN oc_product v ON (v.main_id = p.product_id AND v.type = 2)
        LEFT JOIN oc_product_special as vps ON (vps.product_id = v.product_id AND vps.customer_group_id = '1' AND
                                                (vps.date_start < NOW() AND
                                                 (vps.date_end IS NULL OR vps.date_end > NOW())))
WHERE p.status = '1'
 AND p.date_available <= NOW()
 AND p.type = 0
GROUP BY p.product_id
ORDER BY case when special is null then 2 else 1 end
`

но в результате вот такое, такое впечетление, что на order by оно не обращает внимания никакого
Выведи ещё одной колонкой выражение, что у тебя в order by, и посмотри
источник

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
Vitaliy Sheverov
Ребята, есть вот такой запрос

`SELECT p.product_id,
      MIN(vps.price)                                                            as special,
      MIN(v.price)                                                              as price,
      v.product_id                                                              as variant_product_id,
      vps.product_special_id
FROM oc_product p
        LEFT JOIN oc_product v ON (v.main_id = p.product_id AND v.type = 2)
        LEFT JOIN oc_product_special as vps ON (vps.product_id = v.product_id AND vps.customer_group_id = '1' AND
                                                (vps.date_start < NOW() AND
                                                 (vps.date_end IS NULL OR vps.date_end > NOW())))
WHERE p.status = '1'
 AND p.date_available <= NOW()
 AND p.type = 0
GROUP BY p.product_id
ORDER BY case when special is null then 2 else 1 end
`

но в результате вот такое, такое впечетление, что на order by оно не обращает внимания никакого
А картинку ты на кой прислал?
источник

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
Дмитрий Мачихелян
Подскажите как составить запрос. Есть у меня запрос:
create or replace view contacts_count as 
select contacts.user_id, count(contacts.user_id)
from contacts
group by contacts.user_id
Вот мне нужно сделать так, чтобы в этот запрос подать массив idшников и по ним собирать count. Также в этом массиве могут быть айдишники, которых нет в таблице, но в представлении нужно их отображать с count = 0
Что-то ты много хочешь...
источник

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
Дмитрий Мачихелян
Подскажите как составить запрос. Есть у меня запрос:
create or replace view contacts_count as 
select contacts.user_id, count(contacts.user_id)
from contacts
group by contacts.user_id
Вот мне нужно сделать так, чтобы в этот запрос подать массив idшников и по ним собирать count. Также в этом массиве могут быть айдишники, которых нет в таблице, но в представлении нужно их отображать с count = 0
Ты можешь сделать запрос с этой view и указать фильтр в виде in (....)

Если чего-то нет, добавляй на клиенте
источник

ДМ

Дмитрий Мачихелян... in DBA - русскоговорящее сообщество
Не подскажите хорошую литературу для основ Sql(функции, процедуры, сложные запросы, индексы и тд)?
источник

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
Ilia Zviagin
А вот кому свежие книги...
Вот тут.

И ещё Мартин Грабер.
Введение в SQL
источник