我在 Postgres 中有两个表:
events (id, occurrence_dates) # occurrence_dates is array
dates_calendar (date)
当 events.occurrence_dates
由几个相等的值组成时,{"2017-11-08 00:00:00","2017-11-08 00:00:00"}
2个值为例,下面的查询给出了一条记录:
SELECT "events".*
FROM "events"
INNER JOIN dates_calendar dc ON dc.date = ALL(occurrence_dates)
如何获取与events.occurrence_dates
长度一样多的记录?
UPD:我正在使用 Ruby on Rails,但在 SQL 上下文中提供了问题
基于@michel.milezzi 回答的 Rails 作用域:
scope :all_events, -> do
select("events_sb.*").from(<<-SQL.squish)
dates_calendar dc
INNER JOIN (SELECT *, UNNEST(occurrence_dates) oc_date FROM events) AS events_sb
ON (events_sb.oc_date = dc.date)
SQL
end
最佳答案
您可以使用 UNNEST扩展数组然后使用常规连接:
-- CTE with test data
WITH dates_calendar(date) AS (
VALUES
('2017-11-08 00:00:00'::TIMESTAMP),
('2017-11-09 00:00:00'),
('2017-11-10 00:00:00')
), events (id, occurrence_dates) AS (
VALUES
(1, '{"2017-11-08 00:00:00", "2017-11-08 00:00:00","2017-11-09 00:00:00","2017-11-10 00:00:00"}'::TIMESTAMP[]),
(2, '{"2017-11-08 00:00:00","2017-11-09 00:00:00"}'),
(3, '{"2017-11-08 00:00:00"}')
), events_sb AS (
SELECT id, UNNEST(occurrence_dates) oc_date FROM events
)
SELECT
events_sb.*
FROM
dates_calendar dc JOIN events_sb ON (events_sb.oc_date = dc.date) ORDER BY id;
--CTE
WITH events_sb AS (
SELECT id, UNNEST(occurrence_dates) oc_date FROM events
)
SELECT
events_sb.*
FROM
dates_calendar dc JOIN events_sb ON (events_sb.oc_date = dc.date) ORDER BY id;
--SUBQUERY
SELECT
events_sb.*
FROM
dates_calendar dc JOIN (SELECT id, UNNEST(occurrence_dates) oc_date FROM events) AS events_sb ON (events_sb.oc_date = dc.date) ORDER BY id;
关于sql - 对数组值进行内部联接的结果是多条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47158870/