小编Wil*_*son的帖子

非 IT 人员的数据库暂存环境

我正在向我的 IT 部门提议一个数据库暂存环境。这个想法是像我这样的非 IT 人员(公共工程数据分析师)可以有一个地方来测试解决方案,然后自己在实际环境中实施它们,或者在需要时要求 IT 实施它们。这种环境有益于以下几个原因/场景:

  1. 我对我们的活数据库环境(一些基本的数据库权限create tablecreate view等等)。我大约每周更改一次架构,但在实时环境中测试和实施这些更改对我来说似乎很疯狂。对数据库的依赖数不胜数,因此如果出现问题,可能是灾难性的。我更愿意在单独的环境中提前测试。
  2. 我没有一些更高级的权限,比如create triggercreate function在实时数据库中。这很好,但我确实有一些可以通过触发器和/或函数解决的问题。我计划提议在临时环境中授予我这些权限,以便我可以开发和测试一些想法,如果它们有效,则建议 IT 在实时环境中实施它们。
  3. 通常,我的 IT 部门没有时间或资源为我开发解决方案。真的就是这么简单。因此,如果我可以自己完成跑腿工作,那么我的问题就更有可能得到解决。

“非 IT 人员的临时环境”对我来说似乎是一个足够好的方法,但老实说,我只是提出了这个想法。我不知道这在 IT/数据库世界中通常是如何完成的。

是否有适合这种情况的既定 IT/数据库实践?(在为非 IT 人员提议数据库暂存环境时,我是否走在正确的轨道上?)

replication oracle testing permissions

10
推荐指数
1
解决办法
323
查看次数

在数字表上交叉连接以获取线顶点,有没有更好的方法?

问题:

我有一个空间表(道路线),使用 ESRI 的SDE.ST_GEOMETRY用户定义数据类型存储在 Oracle 12c地理数据库中。我想列出线顶点,以便我最终可以访问和更新它们的坐标。如果我使用的是 SDO_GEOMETRY/Oracle Locator,那么我会使用该 SDO_UTIL.GETVERTICES函数。但是我没有使用 SDO_GEOMETRY/Oracle Locator,并且SDE.ST_GEOMETRY. 唯一的SDE.ST_GEOMETRY 功能,我可以找到属于顶点ST_PointNST_NumPoints

我想出了一个成功完成所有这些的查询 - 将线顶点作为行(受此页面启发):

1    SELECT   a.ROAD_ID
2             ,b.NUMBERS VERTEX_INDEX
3             ,a.SDE.ST_X(SDE.ST_PointN(a.SHAPE, b.NUMBERS)) AS X
4             ,a.SDE.ST_Y(SDE.ST_PointN(a.SHAPE, b.NUMBERS)) AS Y
5    FROM     ENG.ROADS a
6             CROSS JOIN ENG.NUMBERS b
7    WHERE    b.NUMBERS <= SDE.ST_NumPoints(a.SHAPE)
8    --removed to do explain plan: ORDER BY ROAD_ID, b.NUMBERS

----------------------------------------------------------------------------------------------------
| Id  | Operation           | Name …
Run Code Online (Sandbox Code Playgroud)

oracle spatial geometry number-table

8
推荐指数
1
解决办法
683
查看次数

什么是对象关系数据库,为什么在空间数据库中需要这种模型?

GIS SE 中,我们中的许多人使用ESRI 地理数据库。ESRI 将地理数据库描述为object-relational.

什么是对象关系数据库,为什么需要在空间数据库中使用这种模型?

似乎他们采用了一些简单的关系数据库模型,并将其变得复杂。我想知道好处是什么。

我不是 DBA 或开发人员,所以外行的条款将不胜感激。

database-design spatial relational-theory

7
推荐指数
1
解决办法
1513
查看次数

为具有大量列的表(不是 SELECT *)高效编写 SELECT 查询

由于 GIS 软件的限制,我需要为数据库中的 200 多个表中的每一个编写选择查询。查询需要选择除 SHAPE 列之外的所有列。

是否有一种有效的方法来获取每个表的所有字段名称 - 用于编写选择查询?

我试过的:

  1. 我认为这可以通过 SQL Developer(免费)实现。但不幸的是,由于 IT 挑战,我没有 SQL Developer。

  2. 我知道当我SELECT *在 Oracle 中的表上创建视图时,查询被转换为显式选择单个字段。所以我可以 a)SELECT *为每个表创建一个视图,b) 获取视图定义,以及 c) 为每个表编写查询。这可能比手动输入每个字段名称要快,但不会快很多。

如何有效地为具有大量列的表编写选择查询?

oracle select fields

6
推荐指数
1
解决办法
1141
查看次数

为什么将 ROWNUM 添加到查询会提高性能?

我有两个疑问:

1)此查询有一个 ROWNUM 列(执行需要 20 秒):

SELECT
     ROWNUM
     ,ROAD_ID
     ,VERTEX_INDEX
     ,SDE.ST_X(ST_POINT) AS X
     ,SDE.ST_Y(ST_POINT) AS Y
FROM
(
     SELECT  
           ROWNUM
           ,a.ROAD_ID
           ,b.NUMBERS VERTEX_INDEX
           ,SDE.ST_PointN(a.SHAPE, b.NUMBERS) AS ST_POINT
     FROM  ENG.ROAD a
           CROSS JOIN ENG.NUMBERS b
     WHERE b.NUMBERS <= SDE.ST_NUMPOINTS(a.SHAPE)
)
--removed to do explain plan: ORDER BY ROAD_ID, VERTEX_INDEX

-------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name                 | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |                      |  5996 |   322K|       |   262   (1)| 00:00:01 …
Run Code Online (Sandbox Code Playgroud)

performance oracle subquery query-performance

5
推荐指数
1
解决办法
2461
查看次数

版本控制:除了空间之外,该技术是否用于 DBMS?

ESRI 的空间数据库管理系统称为地理数据库( more ),使用一种称为版本控制的技术

版本代表整个地理数据库的时间快照,并包含地理数据库中的所有数据集。

版本不是地理数据库的单独副本。相反,版本和其中发生的事务在系统表中进行跟踪。这将用户的工作隔离在多个编辑会话中,允许用户在不锁定生产版本中的功能或立即影响其他用户且无需制作数据副本的情况下进行编辑。

状态树 http://help.arcgis.com/en/geodatabase/10.0/sdk/arcsde/concepts/versioning/basicprinciples/state.htm

将数据集(要素类、要素数据集或表)注册为版本时,会创建两个增量表:A(或添加)表,记录插入和更新,D(或删除)表,存储删除。每次更新或删除数据集中的记录时,都会向其中一个或两个表中添加行。因此,版本化数据集由原始表(称为基本表或业务表)加上增量表中的任何更改组成。当您进行填充增量表的编辑时,地理数据库会跟踪您连接到的版本。当您查询或显示某个版本中的数据集时,ArcGIS 会组合原始表和增量表中的相关行,以提供该版本数据的无缝视图。

在此处输入图片说明

老实说,我发现文档相当模糊;它并没有告诉我该技术的实际工作原理,或者它基于传统数据库理论的哪一部分。

我想不会有很多 DBA SE 社区成员对 ESRI 的版本控制技术有经验。所以我不会问诸如“它是如何工作的?”之类的问题。

相反,我想知道,在非空间数据库世界中是否有与 ESRI 版本控制类似的技术?

spatial data-versioning

5
推荐指数
1
解决办法
668
查看次数

组值:CASE 文本、ELSE 字段值

我有一张ROAD桌子:

+----+------------+
| ID | ROAD_CLASS |
+----+------------+
|  1 | ARTERIAL A |
|  2 | ARTERIAL B |
|  3 | ARTERIAL B |
|  4 | ARTERIAL C |
|  5 | ARTERIAL C |
|  6 | ARTERIAL C |
|  7 | COLLECTOR  |
|  8 | COLLECTOR  |
|  9 | LOCAL      |
| 10 | LOCAL      |
+----+------------+
Run Code Online (Sandbox Code Playgroud)

ROAD_CLASS字段的数据类型是NVARCHAR2.

我想创建一个视图,将所有主干道路分组到一个ARTERIAL类别中,但将其他道路类保留原样:

+------------+
| ROAD_CLASS |
+------------+ …
Run Code Online (Sandbox Code Playgroud)

oracle case group-by oracle-12c

5
推荐指数
1
解决办法
1697
查看次数

这个查询可以简化吗?计算线段的累积长度并将坐标折叠成线串

在此处输入图片说明

我有一张road_vertices桌子:

create table road_vertices
(
road_id number,
vertex_index number,
x number,
y number
);

insert into road_vertices values ('100',1,0,5);
insert into road_vertices values ('100',2,10,10);
insert into road_vertices values ('100',3,30,0);
insert into road_vertices values ('100',4,50,10);
insert into road_vertices values ('100',5,60,10);

select * from road_vertices;

   ROAD_ID VERTEX_INDEX             X          Y
---------- --------------- ---------- ----------
       100 1                        0          5
       100 2                       10         10
       100 3                       30          0
       100 4                       50         10
       100 5                       60         10
Run Code Online (Sandbox Code Playgroud)

我需要:

  1. 计算线段的累积长度(如上图中灰色文本所示)。
  2. 将坐标和累积长度折叠成线串。

这是最终目标:

ROAD_ID     LINESTRING
---------------------------------------------------------------------------- …
Run Code Online (Sandbox Code Playgroud)

oracle aggregate spatial oracle-12c

5
推荐指数
1
解决办法
247
查看次数

沿线插入日期

road_conditionOracle 12c 中有一张表:

create table road_condition (
    cond_id number(5,0),
    road_id number(5,0),
    cond_date date,
    condition number(5,0)
);

insert into road_condition (cond_id,road_id,cond_date,condition)
values (1,100,to_date('01-NOV-84','DD-MON-RR'),18);
insert into road_condition (cond_id,road_id,cond_date,condition)
values (2,100,to_date('01-JAN-09','DD-MON-RR'),6);
insert into road_condition (cond_id,road_id,cond_date,condition)
values (3,100,to_date('19-JUN-12','DD-MON-RR'),4);
insert into road_condition (cond_id,road_id,cond_date,condition)
values (4,100,to_date('29-APR-15','DD-MON-RR'),4);
insert into road_condition (cond_id,road_id,cond_date,condition)
values (5,200,to_date('29-APR-92','DD-MON-RR'),20);
insert into road_condition (cond_id,road_id,cond_date,condition)
values (6,200,to_date('05-APR-17','DD-MON-RR'),3);
commit;
Run Code Online (Sandbox Code Playgroud)

结果表数据:

COND_ID ROAD_ID   COND_DAT CONDITION
------- -------   -------- ---------
      1     100   84-11-01        18
      2     100   09-01-01         6
      3     100   12-06-19         4
      4     100 …
Run Code Online (Sandbox Code Playgroud)

oracle oracle-12c computed-column date-math

5
推荐指数
2
解决办法
783
查看次数

PostgreSQL 相当于 Oracle 的 ANY_VALUE(...) KEEP (DENSE_RANK FIRST/LAST ORDER BY ...)

Oracle SQL 中有一项技术可用于简化聚合查询:

聚合特定列,但使用 SELECT 列表中的简单计算列从不同列获取信息。

--Oracle
--For a given country, what city has the highest population? (where the country has more than one city)
--Include the city name as a column.
select
    country,
    count(*),
    max(population),
    any_value(city) keep (dense_rank first order by population desc)   --<<--
from
    cities
group by
    country
having
    count(*) > 1
Run Code Online (Sandbox Code Playgroud)

数据库<>小提琴

如上所示,以下列可以带入城市名称,即使城市名称不在 GROUP BY 中:

 any_value(city) keep (dense_rank first order by population desc)
Run Code Online (Sandbox Code Playgroud)

有多种方法可以使用 SQL 来实现此类操作。我正在 PostgreSQL 中寻找一种解决方案,让我可以在计算列中完成此操作 - 所有这些都在单个 SELECT 查询中(没有子查询、联接、WITH 等)。

问题:PostgreSQL 中是否有与 Oracle …

postgresql oracle aggregate group-by greatest-n-per-group

4
推荐指数
1
解决办法
1707
查看次数