小编Luk*_*zda的帖子

PostgreSQL模拟SQL Server索引(包括列)

试图在PostgreSQL上重新创建我的SQL Server数据库.一切都很好,除了我找不到如何重新创建这个索引:

USE [mytablename]  
GO  
CREATE NONCLUSTERED INDEX [myindex]  
ON [dbo].[mytablename] ([col1],[col2])  
INCLUDE ([col3],[col4])  
GO  
Run Code Online (Sandbox Code Playgroud)

将非常感谢您的帮助.

阿列克谢

更新:

http://img38.imageshack.us/img38/1071/89013974.png这里是db结构的明星+ eav
只有一个查询

SELECT this_.id as id0_0_,   
this_.device_id as device2_0_0_,  
this_.time_id as time3_0_0_,  
this_.gps_detail_id as gps4_0_0_   
FROM [scoutserver_data].[dbo].[DataMessage]  this_   
WHERE this_.time_id = 65536 and this_.device_id = 32768  
Run Code Online (Sandbox Code Playgroud)

也许它不是最佳的atm.我正在研究它.也许这样的事情

SELECT * FROM [scoutserver_data].[dbo].[TimeDimension]   
  INNER JOIN ([scoutserver_data].[dbo].[DeviceDimension]   
  INNER JOIN  [scoutserver_data].[dbo].[DataMessage]   
ON [DeviceDimension].[device_id] =[DataMessage].[device_id])  
ON [TimeDimension].[time_id] = [DataMessage].[time_id]  
WHERE DeviceDimension.serial_id='2' AND TimeDimension.Day=15 AND TimeDimension.Year=2009
Run Code Online (Sandbox Code Playgroud)

任何提示欢迎=)

sql database sql-server postgresql database-design

9
推荐指数
2
解决办法
5495
查看次数

SQL Server - 仅使用.modify()合并两个XML

假设我们有:

CREATE TABLE #Users(id INT PRIMARY KEY, name VARCHAR(100), suggestions XML);

INSERT INTO #Users(id, name, suggestions)
SELECT 1, 'Bob', N'<Products>
                     <Product id="1" score="1"/>
                     <Product id="2" score="5"/>
                     <Product id="3" score="4"/>
                   </Products>'
UNION ALL
SELECT 2, 'Jimmy', N'<Products>
                       <Product id="6" score="3"/>
                     </Products>';

DECLARE @userId INT = 1,
        @suggestions XML = N'<Products>
                              <Product id="2" score="5"/>
                              <Product id="3" score="2"/>
                              <Product id="7" score="1" />
                             </Products>';
Run Code Online (Sandbox Code Playgroud)

Playground

现在我想根据id属性合并2个XML :

id = 1的用户的最终结果:

<Products>
  <Product id="1" score="1"/> -- nothing changed (but not exists in @suggestions) …
Run Code Online (Sandbox Code Playgroud)

xml sql t-sql sql-server xpath

9
推荐指数
1
解决办法
942
查看次数

SQL:在varchar字符串中插入换行符

我搜索了StackOverflow以获取有关如何在SQL文本字符串中插入换行符的所有可能解决方案.我已经提到这个链接,但没有用.如何在SQL Server VARCHAR/NVARCHAR字符串中插入换行符

但是没有一个解决方案适合我.

这就是我想要做的:

insert into sample (dex, col) 
values (2, 'This is line 1.' + CHAR(13)+CHAR(10) + 'This is line 2.')
Run Code Online (Sandbox Code Playgroud)

但这是生成的输出:(从样本中选择Col,其中dex = 2)

这是第1行.这是第2行.

这是我想要的输出:

这是第1行.
这是第2行.

如果有帮助,我正在使用SQL服务器和SSMS.

任何想法为什么它不起作用?

sql t-sql sql-server

9
推荐指数
4
解决办法
5万
查看次数

DISTINCT和LAG窗口功能

有一个简单的表:

CREATE TABLE tab AS 
SELECT 1 AS t,   'G' AS company, 40 AS quote
UNION SELECT 2 , 'G',    60 
UNION SELECT 3 , 'S',    60 
UNION SELECT 4,  'S',    20;
Run Code Online (Sandbox Code Playgroud)

并查询:

SELECT DISTINCT company, quote ,LAG(quote) OVER(PARTITION BY company ORDER BY t)
FROM tab;
Run Code Online (Sandbox Code Playgroud)

输出 - 结果在RDBMS之间保持一致.

+---------+-------+------+
| company | quote | lag  |
+---------+-------+------+
| G       |    40 | null |
| S       |    60 | null |
| G       |    60 | 40   |
| …
Run Code Online (Sandbox Code Playgroud)

mysql sql sql-server postgresql

9
推荐指数
1
解决办法
830
查看次数

Oracle - RETURNING与聚合函数相结合

Oracle支持RETURNING可能非常有用的子句.

例如对于数据:

CREATE TABLE t(Id INT, Val varchar2(50));

INSERT INTO t(Id, Val)
SELECT 10,'a' FROM dual
UNION ALL SELECT 20,'b' FROM dual
UNION ALL SELECT 30,'a' FROM dual
UNION ALL SELECT 40,'b' FROM dual;
Run Code Online (Sandbox Code Playgroud)

查询:

DECLARE
   l_cnt INT;
BEGIN
   DELETE FROM t RETURNING COUNT(*) INTO l_cnt;
   DBMS_OUTPUT.put_line('l_cnt: ' || l_cnt);
END;
Run Code Online (Sandbox Code Playgroud)

l_cnt:4

它支持MIN/MAX/AVG/SUM/LISTAGG:

DECLARE
   l_max INT;
   l_min INT;
   l_str VARCHAR2(100);
BEGIN
   DELETE FROM t 
   RETURNING MAX(id), MIN(id), LISTAGG(id, ',') WITHIN GROUP(ORDER BY id) 
   INTO l_max, l_min, l_str;
   DBMS_OUTPUT.put_line('l_max:'||l_max||' …
Run Code Online (Sandbox Code Playgroud)

sql oracle aggregate-functions sql-returning

9
推荐指数
1
解决办法
655
查看次数

在UPDATE语句中会发生什么,在FROM/JOIN子句中没有提到更新的表?

我打算UPDATE在SQL Server数据库表上运行以下语句:

UPDATE TABLE_A
SET COL_1=B.COL_1
FROM TABLE_A A
INNER JOIN TABLE_B B
   ON A.KEY_1=B.KEY_1
WHERE B.COL_2 IS NOT NULL
  AND A.COL_1=91216599
Run Code Online (Sandbox Code Playgroud)

错误地,我改为运行以下语句:

UPDATE TABLE_A
SET COL_1=B.COL_1
FROM TABLE_A_COPY A
INNER JOIN TABLE_B B
   ON A.KEY_1=B.KEY_1
WHERE B.COL_2 is not NULL
  AND A.COL_1=91216599
Run Code Online (Sandbox Code Playgroud)

请注意,在第二个语句(错误的一个)中,FROM子句指定表TABLE_A_COPY而不是TABLE_A.两个表具有完全相同的模式(即,相同的列)和相同的数据(在任何UPDATE执行之前,即).

双方TABLE_ATABLE_A_COPY拥有约100万条记录和更新影响约500000条记录.第二个语句(错误的语句)运行了几个小时并且在第一个语句(正确的语句)运行40秒并且成功时失败.

显然,这两个语句在语法上都是正确的,但我不确定我究竟要求SQL Server对第一个语句做什么.

我的问题是:

  1. SQL Server在第二个语句中尝试做什么?随着我的错误,我没有从指定记录之间的联动TABLE_ATABLE_A_COPY,所以被它试图做两者之间的CROSS JOIN,然后更新每个记录TABLE_A一个极大倍?

  2. 如果要问的问题不是太宽泛,那么UPDATE在这些语句中有什么是有效的方案,其中FROM/JOIN条款中没有提到正在更新的表.为什么有人这样做?为什么SQL Server甚至会允许这样做?


我确实试图寻找我的问题的答案,但谷歌似乎认为我在问UPDATE …

t-sql sql-server sql-update

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

如何更改现有表以在Oracle中创建范围分区

我有现有的表有10年的数据(我已经采取转储).

我想在表中的一个日期键列上对现有表进行Range分区.

我看到的大多数示例都是CREATE TABLE..PARTITION BY RANGE...为了添加新分区.但我的桌子是现有的桌子.

我想我需要一些ALTER陈述.

ALTER TABLE TABLE_NAME
PARTITION BY RANGE(CREATED_DATE)
 PARTITION JAN16 VALUES LESS THAN (01-02-2016),
 PARTITION FEB16 VALUES LESS THAN (01-03-2016) AND GREATER THAN(31-01-2016),//OR?
 PARTITION MAR16 VALUES BETWEEN (01-03-2016) AND (31-03-2016),  //OR?
Run Code Online (Sandbox Code Playgroud)

两个问题..

  1. 我是否需要Alter语句来添加分区机制或需要使用create语句?

  2. 保持每个分区只有一个MONTH数据的正确语法是什么.

oracle alter-table create-table partition

8
推荐指数
2
解决办法
2万
查看次数

使用下划线解析SQL Server编号文字

我想知道为什么它的工作原理以及为什么它不会返回错误:

SELECT 2015_11
Run Code Online (Sandbox Code Playgroud)

结果:

????????
? _11  ?
????????
? 2015 ?
????????
Run Code Online (Sandbox Code Playgroud)

第二种情况:

SELECT 2.1_a

???????
? _a  ?
???????
? 2.1 ?
???????
Run Code Online (Sandbox Code Playgroud)

检查元数据:

SELECT  name, system_type_name
FROM sys.dm_exec_describe_first_result_set(
N'SELECT 2015_11', NULL, 0) 
UNION ALL
SELECT  name, system_type_name
FROM sys.dm_exec_describe_first_result_set(
N'SELECT 3.2_a', NULL, 0) 

???????????????????????????
? name ? system_type_name ?
???????????????????????????
? _11  ? int              ?
? _a   ? numeric(2,1)     ?
???????????????????????????
Run Code Online (Sandbox Code Playgroud)

虽然以字母开头的标识符表现得像我认为的那样:

SELECT a_11
-- Invalid column name 'a_11'.
Run Code Online (Sandbox Code Playgroud)

LiveDemo

sql t-sql sql-server sql-server-2012

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

在PostgreSQL表中生成测试数据

我想用一个SELECT查询为这个表创建100个测试行数据:

CREATE TABLE DOCUMENT_TEMPLATE(
   ID INTEGER NOT NULL,
   NAME TEXT,
   SHORT_DESCRIPTION TEXT,
   AUTHOR TEXT,
   DESCRIPTION TEXT,
   CONTENT TEXT,
   LAST_UPDATED DATE,
   CREATED DATE
);
Run Code Online (Sandbox Code Playgroud)

你能举个例子吗?

sql postgresql postgresql-9.3

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

如何将LONG转换为内联的VARCHAR2

背景:ALL_IND_EXPRESSIONS有专栏

COLUMN_EXPRESSION   LONG   Function-based index expression defining the column
Run Code Online (Sandbox Code Playgroud)

我知道这LONG已被弃用了.我需要编写类似的东西(或做其他文本操作):

SELECT 
  REPLACE(REPLACE(REPLACE(
    q'{ALTER INDEX "<index_owner>"."<index_name>" ON ... (<column_expression>)}'
   ,'<index_owner>', index_owner )
   ,'<index_name>', index_name) 
   ,'<column_expression>', column_expression) AS result
FROM all_ind_expressions;
Run Code Online (Sandbox Code Playgroud)

ORA-00932:不一致的数据类型:预期NUMBER变长

DBFiddle演示

备注:

  • 它必须是自包含的查询
  • 没有中间对象(创建表/视图不是一个选项).
  • 没有 PL/SQL block
  • DBMS_METADATA.GET_DDL (事实并非如此)
  • WITH FUNCTION子句作为最后的手段

是否有可能从投/转换/使用内置函数LONGVARCHAR2

EDIT TL; DR:

SELECT column_expression || 'a'  -- convert to working code
FROM all_ind_expressions;
Run Code Online (Sandbox Code Playgroud)

sql oracle oracle12c

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