.使用T-SQL创建数据库,命名为DataCollation1,,数据文件命名DataCollation,物理路径C:\ProgramFiles\Mi

如题所述

第1个回答  2011-01-12
从一个仅有数额指标的交易表中创建一个查询,这个查询用于会计日志条目。因此如果一个日志条目应该有存款和借款,但是其他的值应该是相同的,因此我想通过SQL查询从一行提取2行记录。听起来很模糊?我Google之后发现没有任何结果,所以我就写了这篇文章。为了简化,这里举个例子。我有一张表叫做SampleTable,它包含如下记录:

现在你的任务是为每个记录创建3行,因此它将显示如下:

现在,你如何实现它呢?有许多种方法,但是我们要找出哪个方法查询效率最高。有下面是那种方法:

交叉连接

UNION查询

WITH查询

1、交叉连接

为了激活大家对交叉连接沉睡的记忆,首先介绍下什么是交叉连接。所谓交叉连接,就是两个表的笛卡尔积的另一称谓。交叉连接为将第一张表的每一行与第二张表的每一行组合产生一新的元组。设两张表R、S分别有k1、k2条记录,每条记录的列数分别为m、n,则交叉连接的结果元组数为k1*k2,每个元组的列数为m+n(前面m列是R的,后面n列是S的)。当然这是在没有where条件的情况下,如果加了where添加可能会过滤掉一部分不符合条件的记录。

所以上面的结果可以看成下面两张表的交叉连接产生的:

因此可以用如下SQL语句:

SELECT SampleTable.ID, SampleTable.FirstName, SampleTable.LastName, Extender.ItemNumber, Extender.ItemDescription
FROM SampleTable CROSS JOIN
(SELECT 1 AS ItemNumber, 'Item 1' AS ItemDescription
UNION ALL
SELECT 2 AS ItemNumber, 'Item 2' AS ItemDescription
UNION ALL
SELECT 3 AS ItemNumber, 'Item 3' AS ItemDescription) AS Extender;

本来是打算对表2构建一张临时表,但考虑到SQL Server与Oracle构建临时表是有差异的,考虑到这个我就用上面这种方式(UNION ALL,集合查询)。

2、UNION操作

UNION是集合操作中的一种,SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可进行集合操作。集合操作主要包括并操作UNION、交操作INTERSECT和差操作EXCEPT。注意,参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同。

下面是实现代码:

SELECT SampleTable.ID, SampleTable.FirstName, SampleTable.LastName, 1 AS ItemNumber, 'Item 1' AS ItemDescription
FROM SampleTable
UNION ALL
SELECT SampleTable.ID, SampleTable.FirstName, SampleTable.LastName, 2 AS ItemNumber, 'Item 2' AS ItemDescription
FROM SampleTable
UNION ALL
SELECT SampleTable.ID, SampleTable.FirstName, SampleTable.LastName, 3 AS ItemNumber, 'Item 3' AS ItemDescription
FROM SampleTable;

3、WITH子句WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数据的部分。特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用WITH AS短语,则只要执行一遍即可。如果WITH AS短语所定义的表名被调用两次以上,则优化器会自动将WITH AS短语所获取的数据放入一个TEMP表里,如果只是被调用一次,则不会。而提示materialize则是强制将WITH AS短语里的数据放入一个全局临时表里。很多查询通过这种方法都可以提高速度。如果你对with子句还是不熟悉理解的话,看下面的例子。下面的查询是:查询具有最大余额的账户的语句,如果具有同样最大查询的账户有很多,他们都会被选择。即假设如果最大余额是10000的账户有3个,则这三个账户都会显示出来。 with max-balance(value) as select max(balance) from account select account-number from account,max-balance where account.balance=max-balance.value 我想看到这,with子句大家都理解了。下面是上面问题的实现代码:

WITH ExtendedTable(ID, FirstName, LastName) AS
(SELECT SampleTable.ID, SampleTable.FirstName, SampleTable.LastName
FROM SampleTable)
SELECT *, 1 AS ItemNumber, 'Item 1' AS ItemDescription from ExtendedTable
UNION ALL
SELECT *, 2 AS ItemNumber, 'Item 2' AS ItemDescription from ExtendedTable
UNION ALL
SELECT *, 3 AS ItemNumber, 'Item 3' AS ItemDescription from ExtendedTable

性能比较上面三种方法都可以得到相同的结果,那到底它们的性能到底如何呢?下面我们把这三种方法的代码放到同一个查询中执行,如下:

-------------------------------------------

方法一、交叉连接

-----------------------------------------

SELECT SampleTable.ID, SampleTable.FirstName, SampleTable.LastName, Extender.ItemNumber, Extender.ItemDescription
FROM SampleTable CROSS JOIN
(SELECT 1 AS ItemNumber, 'Item 1' AS ItemDescription
UNION ALL
SELECT 2 AS ItemNumber, 'Item 2' AS ItemDescription
UNION ALL
SELECT 3 AS ItemNumber, 'Item 3' AS ItemDescription) AS Extender;

------------------------------------------

方法二、UNION操作

-----------------------------------------

SELECT SampleTable.ID, SampleTable.FirstName, SampleTable.LastName, 1 AS ItemNumber, 'Item 1' AS ItemDescription
FROM SampleTable
UNION ALL
SELECT SampleTable.ID, SampleTable.FirstName, SampleTable.LastName, 2 AS ItemNumber, 'Item 2' AS ItemDescription
FROM SampleTable
UNION ALL
SELECT SampleTable.ID, SampleTable.FirstName, SampleTable.LastName, 3 AS ItemNumber, 'Item 3' AS ItemDescription
FROM SampleTable;

-------------------------------------------

方法三、WITH子句

-----------------------------------------

WITH ExtendedTable(ID, FirstName, LastName) AS
(SELECT SampleTable.ID, SampleTable.FirstName, SampleTable.LastName
FROM SampleTable)
SELECT *, 1 AS ItemNumber, 'Item 1' AS ItemDescription from ExtendedTable
UNION ALL
SELECT *, 2 AS ItemNumber, 'Item 2' AS ItemDescription from ExtendedTable
UNION ALL
SELECT *, 3 AS ItemNumber, 'Item 3' AS ItemDescription from ExtendedTable

执行查询时选中包括实际的执行计划(在SQL Server的查询菜单下面),得到执行计划如下图所示(由于图太大分三张贴上)。

方法一:

方法二:

方法三:

从图中我们可以清楚地看到方法一得开销仅占15%,而方法二、三相同都占43%。由此可见交叉连接的性能最好,而union操作与with子句性能相对较低。本回答被提问者采纳
第2个回答  2011-01-10
你是要创建语句,还是要创建步骤 啊 ?

如何修改SQL Server 中数据库的Collation
首先你要确保你有以下权限:需要对 master 数据库的 CREATE DATABASE 权限,或需要 CREATE ANY DATABASE\/ALTER ANY DATABASE 权限。需要对数据库拥有 ALTER 权限。然后你可以使用SSMS或者T-SQL去修改collation。

sql中的collation干什么用
在T-SQL中使用COLLATE DATABASE_DEFAULT来解决冲突 ——接下来主要讨论这个COLLATE DATABASE_DEFAULT Collate XXX 操作可以用在字段定义或使用时,它会将字段定义或转换成XXX 的排序规则格式。而Collate Database_Default 则会将字段定义或转换成当前数据库的默认排序规则,从而解决冲突。比如在下面的代码中便使用了Collate...

如何修改SQL Server 中数据库的Collation
首先你要确保你有以下权限:需要对 master 数据库的 CREATE DATABASE 权限,或需要 CREATE ANY DATABASE\/ALTER ANY DATABASE 权限。需要对数据库拥有 ALTER 权限。然后你可以使用SSMS或者T-SQL去修改collation。参考链接:https:\/\/msdn.microsoft.com\/zh-cn\/library\/ms175835.aspx ...

如何修改SQL Server 中数据库的Collation
首先你要确保你有以下权限:需要对 master 数据库的 CREATE DATABASE 权限,或需要 CREATE ANY DATABASE\/ALTER ANY DATABASE 权限。需要对数据库拥有 ALTER 权限。然后你可以使用SSMS或者T-SQL去修改collation。参考链接:https:\/\/msdn.microsoft.com\/zh-cn\/library\/ms175835.aspx ...

T-SQL到底是什么?
例如,当执行 T-SQL 指令码并将输出结果储存到一个档案时,提供使用者资讯的程序就会相当有帮助。您可以将 sp_helpfile、sp_helpfilegroup以及 sp_helpdb 的执行结果储存在特定的资料库中,毕竟当您需要重建资料库时有必要了解档案、档案群组、资料库选项在起初建立时的原始设定。在 SQL Server 7.0 新增并保留 SQL ...

mysql添加列、删除列,创建主键、备份等常用操作总结
1. 导出整个数据库:mysqldump -u root -p test_database > \/tmp\/test.sql 2. 导出单个表:mysqldump -u root -p test_database test_table > \/tmp\/test.sql 3. 导出数据库结构(不包含数据):mysqldump -u root -p -d --add-drop-table test_database > \/tmp\/test.sql 4. 导出...

在导入sql server数据库时,怎么老是出现乱码呀???
go select * from syscharsets go 如果记录中chinses_prc开头的都是支持简体中文的字符集 1. 字符集是支持双字节的字符集如中文字符集(Collation name为Chinese_PRC_CI_AS)<1>. 定义varchar(2)(1) 正式表 总结:在中文字符集下,定义varchar(x), 不论使用不使用N'',英文字符都占1个字节,...

sql语句 如何创建一个表啊?
创建表的SQL语句根据不同的数据库会有所不同,常见的几种数据库创建方式如下:创建一个表。表名字Persons,第一列Id_P,整数类型;第二列LASTName,字符类型;第三列FirstName,字符类型。微软VS SQL 2008 数据库 mysql 数据库 sqlite 数据库 ...

Delphi连接sql数据库过程界面会卡死怎么办
可以尝试如下作法:1. 自定义一个类,ADOConnection、ADOQUERY为其成员域成员动态创建;2. 启动线程去执行连接操作;此线程有一标志,当连接有结果(成功或失败)后置TRUE;3. 界面单元调用此线程,WHILE判断线程标志为TRUE时,说明连接有结果。while not customerThread.flag do begin application....

谁能给个SQL中用CREATE TABLE 创建数据库表的建表事例,急
database_name是要在其中创建表的数据库名称。database_name 必须是现有数据库的名称。如果不指定数据库,database_name 默认为当前数据库。当前连接的登录必须在 database_name 所指定的数据库中有关联的现有用户 ID,而该用户 ID 必须具有创建表的权限。owner是新表所有者的用户 ID 名,owner 必须是 database_...

相似回答
大家正在搜