目前,我看到了一个 ETL 流程,其中用户创建了用于存储中间结果的表,然后在 ETL 流程结束时删除这些表。
乍一看,这似乎不是正确的做法,因为我一直都知道这应该通过临时表来完成,但是当涉及到与用户争论为什么他应该使用临时表来进行推理时普通表(最后下降)我找不到任何理由。
目前,我看到了一个 ETL 流程,其中用户创建了用于存储中间结果的表,然后在 ETL 流程结束时删除这些表。
乍一看,这似乎不是正确的做法,因为我一直都知道这应该通过临时表来完成,但是当涉及到与用户争论为什么他应该使用临时表来进行推理时普通表(最后下降)我找不到任何理由。
我一直在构建存储过程,但找不到任何关于 SQL Server 优化器如何处理 #temp 表的文档。
如果我有 4 个连接到 #temp 表,其中在存储过程执行期间创建了该 #temp 表,并且 #temp 表可能包含零到多条记录,它是如何估计的?
由于CREATE/ALTER时没有统计信息,估计和join中的一些表一样大吗?估计很小吗?估计和其他#temporary表一样吗?
请注意,这是假设在执行时没有重新编译并且使用原始版本。
简化代码
var sql = @" create table #Temp(
int Id NOT NULL
CONSTRAINT [PK_TempId] PRIMARY KEY (Id)
)
insert into #temp(id) select (Id) from SomeOtherTable
select Id from #Temp
"
using (var db = new MyDbContext())
{
var results = db.Database.SqlQuery<int>(sql).ToList();
return results;
}
导致间歇性错误
There is already an object named PK_TempId in the database
我已经添加了
drop table #temp
并且正在等待查找是否可以解决问题。
在我添加索引之前,代码运行多年没有任何问题,也没有明显需要删除临时表。
我在这里找到了一个建议,即不应在临时表中使用命名索引。但我不确定有什么替代方案。
我有以下语句在我省略ORDER BY
子句时有效,或者如果我将其作为选择运行并省略创建表部分,但我需要两者来确保我生成的密钥的顺序正确
有任何想法吗?
消息 104381,级别 16,状态 1,第 18 行
ORDER BY 子句在视图、CREATE TABLE AS SELECT、INSERT SELECT、SELECT INTO、内联函数、派生表、子查询和公用表表达式中无效,除非 TOP 或 FOR XML 是也指定。
CREATE TABLE #demo
WITH (DISTRIBUTION = ROUND_ROBIN)
AS
SELECT
ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS ID,
schemas.name as [schema],
tables.name as [table],
columns.column_id as [ordinal],
columns.name as [column],
types.name as [type]
FROM SYS.COLUMNS
inner join sys.types
on types.system_type_id = columns.system_type_id
inner join sys.tables
on tables.object_id = columns.object_id
inner join sys.schemas
on schemas.schema_id = tables.schema_id
order by schemas.name,
tables.name,
columns.column_id
如标题中所述。MySQL 是否支持在本地定义表?(也许作为“局部变量”?)
我了解(根据“来源”)MySQL 有“两种类型的变量”:(1)本地变量和(2)用户变量,但两者都不能是一个完整的表。
资源:
编辑:我认为在“创建”中使用“临时”标志是答案
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
来自文档:https ://dev.mysql.com/doc/refman/8.0/en/create-table.html
在将其发布在这里之前,我已经查找了类似问题的不同答案。
所以我有一个包含用户 ID 和日期列的表
我想将选择查询的结果存储到临时表中。关于使用以下语句:
创建临时表 dummy_table ( select User_Id , DATE_FORMAT( Date
,'%M %Y') from result_table.user_signup_date );
抛出错误错误代码:1292。截断不正确的日期时间值:'2019-06-16 00:00:00 UTC'
我注意到该错误仅在我格式化日期列时发生。我尝试将日期转换为字符串。我还尝试了 str_to_date(DATE_FORMAT( Date
,'%M %Y') ,'%M %Y %H:%i:%s') 和其他一些语法,但没有结果。
我是 Sql 新手。任何帮助,将不胜感激。提前致谢
我想使用 select 语句创建一个临时表,该语句使用 WITH 语句中指定的临时视图(不是 CREATE TEMPORARY TABLE 的 WITH 语句)。
例如类似的东西
WITH a AS (
SELECT 1 foo, 2 bar
), b AS (
SELECT 4 bar, 5 baz
)
CREATE TEMPORARY TABLE foo AS
SELECT * from a JOIN b ON (a.bar=b.bar)
如果我注释掉 CREATE TEMPORARY TABLE 行,这行得通。如何使用 SELECT 的查询结果创建临时表,而不将临时视图重写为单个查询?
我有一个存储过程,用于将 csv 文件加载到 SQL Server。这最初会将文件批量插入到全局临时表中,然后在最后它将执行:
select cast(column1 as int) [column1], column2, column3... into table from ##temptable
然后继续删除##temptable
在查询之前,select into table from ##temptable
我对临时表运行了一系列select
查询以确定列应该是什么类型(我相信这可以正常工作)。
请注意,在创建最终输出表之前拥有一个表(普通表或临时表)对于存储过程至关重要。
我想知道的是,我是使用全局临时表更好,还是应该使用普通表,还是没有区别?
我已经看过几篇关于临时表和表变量之间差异的文章,但是在将全局临时表与普通表进行比较时,我什么也没看到,而且我很难在我的环境中正确地测试它。
我们正在尝试使用创建全局临时表
Create global Temporary table t1 ( id NUMBER, description VARCHAR2(20) )
ON COMMIT Delete Rows;
并尝试在最后手动删除它,但创建的临时表不能被删除,但会话数据在最后被截断。
为什么临时表不能引用 PostgreSQL 中的非临时表?当我运行以下
CREATE TABLE foo ( a int PRIMARY KEY );
CREATE TEMP TABLE bar ( a int REFERENCES foo );
我明白了,
错误:临时表的约束可能只引用临时表
我认为这曾经可以工作,所以我回到 PostgreSQL 8.4,即使这样我也看到它曾经出错,
错误:无法从临时表约束中引用永久表
这是为什么?为什么临时表不能引用非临时表。