sql - 对数组值进行内部联接的结果是多条记录

标签 sql ruby-on-rails postgresql

我在 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;

要在 Rails 中调用它,您必须执行普通的 sql,这样解释 herehere .

关于sql - 对数组值进行内部联接的结果是多条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47158870/

相关文章:

ruby-on-rails - Rails - 检查数组中的任何对象是否为 ActiveRecord 实例

javascript - 在 respond_to 中呈现不同的 Javascript 文件

postgreSQL:jsonb遍历

sql - 使用函数进行查询比使用子选择进行相同查询花费的时间更长

mysql - SQL 更新 - 不工作

ruby-on-rails - ActiveRecord 获取所有模型记录以及符合某些条件的记录

sql - postgresQL 中的参数可以使用 "?"吗?

node.js - 在 Postgres 和 Node 之间加密/解密

sql - 如何从SQLite数据库获取最后一个表

php mysql查询返回多行,将数据保存到对象