1

我似乎以错误的方式思考sql。我总是写一些不起作用的东西。

例如我需要一个变量。所以我认为:

DECLARE @CNT AS INT
SET @CNT = COUNT(DISTINCT database.schema.table.column)

为什么这不起作用...?我在这里使用的是完全限定的参考,所以我想要的值应该很清楚。

DECLARE @CNT AS INT
SET @CNT = (SELECT COUNT(DISTINCT database.schema.table.column) FROM column)

这有效......但为什么我必须使用选择?

是否所有内容都必须以 DDL 或 DML 语句之一开头?

其次:我无法逐行调试,因为一条sql语句被视为一步。我可以调试的唯一方法是,如果我选择最里面的子查询并运行它,然后包含下一个外部子查询并运行它,依此类推。

有本地窗口吗?

我听说过基于集合的思维而不是迭代思维,我想即使对于函数式语言我仍然是迭代的......迭代只是从最里面的括号到最外面的括号,并应用于整个集合。但即使在这里我也遇到了麻烦,因为我不知道集合中的哪个值会导致错误。

抱歉,如果这看起来很散漫……我想这只是反映了我对此的感受。我不知道如何从许多小组件构建一个大存储过程......就像在 vba 中一样,我可以调用另一个子例程并确保我需要的变量是全局的。

tldr:需要概念基础/知道当我键入内容并按 F5 时实际发生的情况

4

2 回答 2

6

在问题 #1 中,您需要选择,因为这就是 SQL 的工作方式。您已经给它一个名称,但没有告诉它如何处理该名称(选择它、更新它、删除它?)只是说列名在语法上不正确。

在 #2 上,是的,SQL 是声明性的,您不是在告诉它要做什么而是告诉它要返回什么。它将在特定时刻以最有效的顺序检索数据,通常您的子查询将是最后运行的,而不是第一个。

于 2017-07-20T13:16:39.633 回答
0

是的,您必须先使用SELECTin-order 获取该数据,然后将其分配给变量。你也可以这样做

DECLARE @CNT AS INT
SELECT @CNT = COUNT(DISTINCT `column`) FROM database.schema.table
于 2017-07-20T13:07:50.740 回答