我们有两个关系foos
和bars
与以下DDL:
CREATE TABLE foos(
id serial PRIMARY KEY, -- surrogate key
name character varying (255) NOT NULL,
inserted_at timestamp without time zone DEFAULT now() NOT NULL
);
CREATE TABLE bars(
id serial PRIMARY KEY, -- surrogate key
passkey character (5) UNIQUE NOT NULL,
inserted_at timestamp without time zone DEFAULT now() NOT NULL
);
正如您所看到的,这两个表中都没有外键。 但是,我想加入他们的时间戳。问题是,我们要加入的时间戳不会重叠。
让我用一个典型的例子来解释这个问题。
假设我们在表格中有这些元组:
INSERT INTO foos (name, inserted_at) VALUES
('brian', '2017-01-16 04:52:41.060506'),
('alice', '2017-01-16 08:22:15.012303'),
('shan', '2017-01-16 10:36:45.123872'),
('marshall', '2017-01-16 10:41:49.123822'),
('jane', '2017-01-16 14:22:39.123123');
INSERT INTO bars (passkey, inserted_at) VALUES
('812he', '2017-01-16 04:53:18.123123'),
('1237s', '2017-01-16 08:23:02.120332'),
('asd72', '2017-01-16 10:42:52.123746'),
('asdks', '2017-01-16 14:23:11.123123');
我想要执行的SQL查询应该像这样获取行:
query(name, passkey)::
('brian', '812he')
('alice', '1237s')
('marshall', 'asd72')
('jane', 'asdks')
通过比较bars
值,通知表foos
与表inserted_at
结合使用。每个bar
都与最近的foo
配对。
如何编写那种SQL查询?它甚至是连接操作吗?
如果有疑问,我正在使用 PostgreSQL 9.6.1 。
我为什么决定构建这样的架构的一点解释:
我给出的表格只是规范的例子。实际上,foos
表是五个表的并集,它们是兄弟子类的具体表。外键方法会导致我将五个外键放到bars
表中,以保持完整性。但是,只有一个密钥会存在,所以这在最后没有意义(我无法设法应用检查它的外部谓词)。
时间戳是否有彼此的关系?
是的,当且仅当foo
在未来三分钟内具有相应的bar
时,才能匹配每个PlayersTab.setCurrentTab(0)
。
答案 0 :(得分:2)
根据经验,应该加入彼此相距2分钟内插入的两条记录,然后我们可以编写以下查询:
SELECT f.name, b.passkey
FROM foos f
INNER JOIN bars b
ON GREATEST(b.inserted_at, f.inserted_at) -
LEAST(b.inserted_at, f.inserted_at) < interval '2 minutes' -- or another interval
<强>解释强>
我们需要使用某种解决方法来计算两个时间戳之间的绝对差异。原因是我们事先并不知道来自foos
的时间戳或来自bars
的时间戳是否会大于另一个时间戳。 GREATEST/LEAST
技巧是一种选择。完成此操作后,将此差异与间隔2分钟进行比较。