我可以在SQL Server中选择0列吗?

Woo*_*III 6 t-sql sql-server sql-server-2005

我希望这个问题比类似的创建一个没有列的表更好.是的,我在问一些最无意义的学术问题.

生成具有0行(但具有列)的SELECT结果很容易,例如SELECT a = 1 WHERE 1 = 0.

是否可以生成具有0列(但具有行)的SELECT结果? 例如SELECT NO COLUMNS FROM Foo.(这不是有效的T-SQL.)

我遇到了这个,因为我想插入几行而不指定任何列数据.例如(SQL Server 2005)

CREATE TABLE Bar (id INT NOT NULL IDENTITY PRIMARY KEY)
INSERT INTO Bar SELECT NO COLUMNS FROM Foo
-- Invalid column name 'NO'.
-- An explicit value for the identity column in table 'Bar' can only be specified when a column list is used and IDENTITY_INSERT is ON.
Run Code Online (Sandbox Code Playgroud)

可以插入单行而不指定任何列数据,例如INSERT INTO Foo DEFAULT VALUES.

可以查询行数(不从表中检索实际列数据),例如SELECT COUNT(*) FROM Foo.(但结果集当然有一栏.)

我尝试过类似的东西

INSERT INTO Bar () SELECT * FROM Foo
  -- Parameters supplied for object 'Bar' which is not a function.
  -- If the parameters are intended as a table hint, a WITH keyword is required.
Run Code Online (Sandbox Code Playgroud)

INSERT INTO Bar DEFAULT VALUES SELECT * FROM Foo
  -- which is a standalone INSERT statement followed by a standalone SELECT statement.
Run Code Online (Sandbox Code Playgroud)

我能以不同的方式做我需要做的事情,但支持退化案例的明显缺乏一致性让我感到惊讶.

我仔细阅读了BOL的相关章节,没有看到任何内容.我很惊讶也没有通过Google提出任何建议.

nvo*_*gel 6

这是SQL的一个重要限制,也是SQL不是关系完整的一个原因.

您可能知道,Hugh Darwen为两个零度关系发明了名称DUM和DEE.SQL没有它们的等价物.

  • 它使SQL不如关系代数强大.或者换句话说,在SQL中,并非所有结果都可以通过关系表达式单独获得,并且语言不那么正交且结果更复杂.例如,SQL使用EXISTS运算符来测试行的存在,并将结果集转换为true或false值.该EXISTS运算符仅在查询中的某些位置有效.而在关系术语中,您只需编写"PROJECT(..)R"即可获得0或1元组的零度关系,然后将其整齐地连接到查询的任何其他部分. (4认同)
  • 空键对于每个数据库只需设置一次的变量或常量的单行表很有用.在SQL中,您必须创建一个虚拟列和/或一个CHECK约束来强制只允许单行的密钥.如果要实现第二范式以满足{} - > {A}之类的FD,则隐式需要支持空键. (3认同)