试图在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)
任何提示欢迎=)
假设我们有:
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)
现在我想根据id属性合并2个XML :
id = 1的用户的最终结果:
<Products>
<Product id="1" score="1"/> -- nothing changed (but not exists in @suggestions) …Run Code Online (Sandbox Code Playgroud) 我搜索了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.
任何想法为什么它不起作用?
有一个简单的表:
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) 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) 我打算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_A并TABLE_A_COPY拥有约100万条记录和更新影响约500000条记录.第二个语句(错误的语句)运行了几个小时并且在第一个语句(正确的语句)运行40秒并且成功时失败.
显然,这两个语句在语法上都是正确的,但我不确定我究竟要求SQL Server对第一个语句做什么.
我的问题是:
SQL Server在第二个语句中尝试做什么?随着我的错误,我没有从指定记录之间的联动TABLE_A来TABLE_A_COPY,所以被它试图做两者之间的CROSS JOIN,然后更新每个记录TABLE_A一个极大倍?
如果要问的问题不是太宽泛,那么UPDATE在这些语句中有什么是有效的方案,其中FROM/JOIN条款中没有提到正在更新的表.为什么有人这样做?为什么SQL Server甚至会允许这样做?
我确实试图寻找我的问题的答案,但谷歌似乎认为我在问UPDATE …
我有现有的表有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)
两个问题..
我是否需要Alter语句来添加分区机制或需要使用create语句?
保持每个分区只有一个MONTH数据的正确语法是什么.
我想知道为什么它的工作原理以及为什么它不会返回错误:
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)
我想用一个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)
你能举个例子吗?
背景:ALL_IND_EXPRESSIONS有专栏
Run Code Online (Sandbox Code Playgroud)COLUMN_EXPRESSION LONG Function-based index expression defining the column
我知道这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变长
备注:
PL/SQL blockDBMS_METADATA.GET_DDL (事实并非如此)是否有可能从投/转换/使用内置函数LONG来VARCHAR2?
EDIT TL; DR:
SELECT column_expression || 'a' -- convert to working code
FROM all_ind_expressions;
Run Code Online (Sandbox Code Playgroud) sql ×8
sql-server ×6
t-sql ×4
oracle ×3
postgresql ×3
alter-table ×1
create-table ×1
database ×1
mysql ×1
oracle12c ×1
partition ×1
sql-update ×1
xml ×1
xpath ×1