我似乎以错误的方式思考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)
这有效......但为什么我必须使用select?
是否所有内容都必须以DDL或DML语句之一开头?
其次: 我无法逐行调试,因为sql语句被视为一步。我可以调试的唯一方法是,如果我选择最里面的子查询并运行它,那么包括下一个外部子查询并运行它,依此类推。
是否有本地窗口?
我听说过基于集合的思维而不是迭代思维,我想即使对于函数式语言我仍然是迭代的......迭代只是从最里面的括号到最外面的括号,并应用于整个集合。但即使在这里我也遇到了麻烦,因为我不知道集合中的哪个值会导致错误。
对不起,如果这看起来像是散乱的......我想这只是反映了我的感受。我不知道如何从许多小组件构建一个大的存储过程......就像在vba中我可以调用另一个子例程并确保我需要的变量是全局的。
tldr:需要概念性基础/知道当我输入内容并点击F5时实际发生了什么
答案 0 :(得分:5)
在问题#1上,您需要选择,因为这是SQL的工作原理。你已经给它起了一个名字,但是没有告诉它该如何处理这个名字(选择它,更新它,删除它?)只是说列名在语法上是不正确的。
在#2上,是的,SQL是声明性的,你不会告诉它做什么,你告诉它要什么返回。它将按照在特定时刻最有效的顺序检索数据,通常,您的子查询将是最后运行的,而不是第一个。
答案 1 :(得分:0)
是的,您必须先使用SELECT
来获取该数据,然后再将其分配给变量。你也可以这样做
DECLARE @CNT AS INT
SELECT @CNT = COUNT(DISTINCT `column`) FROM database.schema.table