我在 PostgreSQL 文档中看到了以下查询。不幸的是,我不明白加入标准。
create temp table tmp_stat_user_tables as select * from pg_stat_user_tables;
select * from pg_stat_user_tables n
join tmp_stat_user_tables t
on n.relid=t.relid
and (n.seq_scan,n.idx_scan,n.n_tup_ins,n.n_tup_upd,n.n_tup_del) <>
(t.seq_scan,t.idx_scan,t.n_tup_ins,t.n_tup_upd,t.n_tup_del);
Run Code Online (Sandbox Code Playgroud)
我需要如何理解 JOIN 子句?
这些表的用途以及第一个查询在做什么对我来说很清楚。
我假设:
(n.seq_scan,n.idx_scan,n.n_tup_ins,n.n_tup_upd,n.n_tup_del) <>
(t.seq_scan,t.idx_scan,t.n_tup_ins,t.n_tup_upd,t.n_tup_del)
Run Code Online (Sandbox Code Playgroud)
是什么让你感到困惑。这意味着如果任何列不同,则谓词为真。它是一种更短的形式:
NOT ( (n.seq_scan,n.idx_scan,n.n_tup_ins,n.n_tup_upd,n.n_tup_del) =
(t.seq_scan,t.idx_scan,t.n_tup_ins,t.n_tup_upd,t.n_tup_del) )
Run Code Online (Sandbox Code Playgroud)
反过来可以重写为
NOT ( n.seq_scan = t.seq_scan AND
n.idx_scan = t.idx_scan AND
... )
Run Code Online (Sandbox Code Playgroud)
不确定它是否更容易掌握,但也可以使用析取来编写
( n.seq_scan <> t.seq_scan OR
n.idx_scan <> t.idx_scan OR
... )
Run Code Online (Sandbox Code Playgroud)
编辑:
Nulls 使逻辑推理变得困难,所以我创建了一个小例子来验证上述表达式的逻辑等价性。我认为只使用两个变量就足够了(http://sqlfiddle.com/#!15/73c52/2):
create table s (x int);
insert into s(x) values (null),(0),(1);
create table t (x int, y int);
insert into t(x,y) select s1.x, s2.x from s s1 cross join s s2;
Run Code Online (Sandbox Code Playgroud)
以下表达式对应于我上面使用的表达式:
select (t1.x,t1.y)<>(t2.x,t2.y) as a
, not( (t1.x,t1.y)=(t2.x,t2.y)) as b
, not ( t1.x = t2.x and t1.y = t2.y ) as c
, t1.x <> t2.x or t1.y <> t2.y as d
from t t1
cross join t t2;
a b c d
(null) (null) (null) (null)
(null) (null) (null) (null)
(null) (null) (null) (null)
(null) (null) (null) (null)
(null) (null) (null) (null)
(null) (null) (null) (null)
(null) (null) (null) (null)
(null) (null) (null) (null)
(null) (null) (null) (null)
(null) (null) (null) (null)
(null) (null) (null) (null)
true true true true
(null) (null) (null) (null)
(null) (null) (null) (null)
true true true true
(null) (null) (null) (null)
(null) (null) (null) (null)
true true true true
(null) (null) (null) (null)
true true true true
(null) (null) (null) (null)
(null) (null) (null) (null)
true true true true
(null) (null) (null) (null)
(null) (null) (null) (null)
true true true true
(null) (null) (null) (null)
(null) (null) (null) (null)
(null) (null) (null) (null)
(null) (null) (null) (null)
(null) (null) (null) (null)
(null) (null) (null) (null)
(null) (null) (null) (null)
true true true true
true true true true
true true true true
(null) (null) (null) (null)
(null) (null) (null) (null)
true true true true
(null) (null) (null) (null)
false false false false
true true true true
true true true true
true true true true
true true true true
(null) (null) (null) (null)
true true true true
(null) (null) (null) (null)
(null) (null) (null) (null)
true true true true
false false false false
true true true true
true true true true
true true true true
(null) (null) (null) (null)
(null) (null) (null) (null)
(null) (null) (null) (null)
true true true true
true true true true
true true true true
(null) (null) (null) (null)
(null) (null) (null) (null)
(null) (null) (null) (null)
(null) (null) (null) (null)
(null) (null) (null) (null)
true true true true
true true true true
true true true true
true true true true
(null) (null) (null) (null)
false false false false
true true true true
(null) (null) (null) (null)
true true true true
(null) (null) (null) (null)
true true true true
true true true true
true true true true
(null) (null) (null) (null)
true true true true
false false false false
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
157 次 |
最近记录: |