我知道这听起来有点完全,这就是为什么我要问是否有人对基于集合的编程是什么有更优雅的解释(在SQL上下文中).
假设一个由以下表组成的模式:
巴兹
BazID (PK, Identity)
Description
Run Code Online (Sandbox Code Playgroud)
FooTemplate(A Baz可能有零到多个FooTemplates)
FooTemplateID (PK, Identity)
BazID (FK)
Description
NextGenerationDate
Run Code Online (Sandbox Code Playgroud)
BarTemplate(一个FooTemplate可能有零到多个BarTemplates)
BarTemplateID (PK, Identity)
FooTemplateID (FK)
Description
Run Code Online (Sandbox Code Playgroud)
Foo(A Baz可能有零到多个Foos)
FooID (PK, Identity)
BazID (FK)
Description
Run Code Online (Sandbox Code Playgroud)
酒吧(A Foo可能有零到多个酒吧)
BarID (PK, Identity)
FooID (FK)
Description
Run Code Online (Sandbox Code Playgroud)
每天将执行存储过程以生成已经过其下一代日期的关联实体的实体Foo和Bar实体Baz.
这个过程的第一部分看起来有点像这样:
DECLARE @GeneratedFooIDList TABLE (INT FooID);
INSERT Foo (BazID, Description)
OUTPUT inserted.FooID INTO @GeneratedFooIDList
SELECT
BazID
Description
FROM
FooTemplate
WHERE
NextGenerationDate < GETDATE()
Run Code Online (Sandbox Code Playgroud)
我的问题是我现在可以执行什么语句来生成适当的Bar实体并使它们与新创建的Foo实体正确关联?
编辑:该过程将在运行SQL Server …
在MySql中处理多行的好方法是什么,因为我在与ODBC连接的客户端应用程序中有很长的键列表?
注意:我的经验主要是SQL Server,所以我知道一点,而不是专门针对MySQL.
任务是从9个表中删除一些行,但我可能有超过5,000个密钥对.
我开始时使用简单的方法循环遍历所有密钥,并针对每个表为每个密钥提交一个语句,例如:
DELETE FROM Table WHERE Key1 = 123 AND Key2 = 567 -- and 8 more tables
DELETE FROM Table WHERE Key1 = 124 AND Key2 = 568 -- and 8 more tables
DELETE FROM Table WHERE Key1 = 125 AND Key2 = 569 -- and 8 more tables
...
Run Code Online (Sandbox Code Playgroud)
除此之外,有45,000个单独的陈述,你可以想象这有点慢.
因此,在不担心我在前端使用的编程语言的情况下,提交列表的好方法是什么,以便我可以一次或至少大批量地加入并执行操作?以下是我的想法:
创建临时表并插入,然后加入.我很乐意查找MySQL的语法来创建临时表,但这是一条很好的路线吗?
假设我使用临时表,那么填充临时表的最佳方法是什么?5000条INSERT Table VALUES ()陈述?SELECT 123, 456 UNION ALL SELECT 124, 457?我刚刚测试过MySql允许这种不针对表发出的SELECT.但是如果列表太长,SQL Server最终会爆炸,所以这在MySQL中是一个好方法吗?我应该一次将列表保持几百个吗?
--CREATE …Run Code Online (Sandbox Code Playgroud)在SQL中,应该总是努力进行基于集合的操作而不是基于迭代的(即循环).在.NET中,我们经常循环集合和对象..NET中是否有允许基于集合处理的命令,或者是基于迭代的所有命令?(我想起了如何DataAdapter.Fill调用DataReader遍历结果集中每条记录的调用).我并不十分熟悉LINQ,但我的猜测是它的实现只会掩盖幕后发生的迭代.
更新:
澄清一点:我并不是说自己在这里有任何天才,我不是第二个猜测让我的人生编程变得更好的优秀人才.我只是在询问是否存在执行基于集合的操作的命令,就像SQL在您执行操作时所做的那样UPDATE,foreach(var item in obj) { ... }明显地在对象中进行迭代.如果他们使用循环,SQL开发人员就会受到严厉批评,但在.NET中,我们会一直使用它们.作为一个在SQL和.NET上都很重要的开发者,我在问.NET中是否有任何替代方法可以完全避免循环.
我似乎以错误的方式思考sql.我总是写不起作用的东西.
例如,我需要一个变量.所以我认为:
DECLARE @CNT AS INT
SET @CNT = COUNT(DISTINCT database.schema.table.column)
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用......?我在这里使用完全限定的引用,所以我想要的值应该是清楚的.
DECLARE @CNT AS INT
SET @CNT = (SELECT COUNT(DISTINCT database.schema.table.column) FROM column)
Run Code Online (Sandbox Code Playgroud)
这有效...但为什么我必须使用选择?
是否所有内容都必须以DDL或DML语句之一开头?
其次:我无法逐行调试,因为sql语句被视为一步.我可以调试的唯一方法是,如果我选择最里面的子查询并运行它,那么包括下一个外部子查询并运行它,依此类推.
当地人的窗户有吗?
我听说过基于集合的思维而不是迭代思维,我想即使对于函数式语言我仍然是迭代的...迭代只是从最里面的括号到最外面的括号,并应用于整个集合.但即使在这里我遇到麻烦,因为我不知道集合中的哪个值导致错误.
对不起,如果这似乎散乱了......我想这只是反映了我的感受.我不知道如何从许多小组件构建一个大的存储过程......就像在vba中我可以调用另一个子例程并确保我需要的变量是全局的.
tldr:需要概念基础/知道当我输入内容并点击F5时实际发生了什么
我想知道是否有人可以确认PostgreSQL Inlining的预期行为?
从Microsoft SQL的世界来看,任何确定为内联的函数都将在多个行的单个迭代中使用(该函数主体实质上已注入到调用程序语句中,使其成为基于集合的[一个调用],而不是每个输入数据行都有一个探针(多次调用))。
我和我的团队正在努力在没有诸如MSSQL之类的Profiler的情况下证明这一点,但我们最终得以证明这一点,并发现我们认为函数内联的迭代次数与它所处的行数成正比。运作。
为此,我们在函数(pg_sleep)中引入了有意的等待,在其中我们可以看到等待N秒会导致Rows * N的总执行时间,即输入6行,等待1秒就是6秒,等待2是12,依此类推。
因此,我们的问题是:
set-based ×6
sql ×4
.net ×1
execution ×1
iteration ×1
list ×1
mysql ×1
postgresql ×1
sql-server ×1
t-sql ×1