Я могу выбрать 0 столбцов в SQL Server?

Я надеюсь, что этот вопрос тарифы немного лучше, чем подобное Составляет таблицу без столбцов. Да, я спрашиваю о чем-то, что ударит больше всего как бессмысленно академический.

Легко привести к ИЗБРАННОМУ результату с 0 строками (но со столбцами), например. SELECT a = 1 WHERE 1 = 0.

Действительно ли возможно привести к ИЗБРАННОМУ результату с 0 столбцами (но со строками)? например, что-то как 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.

Можно вставить одну строку, не указывая данных столбца, например. 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.

и

INSERT INTO Bar DEFAULT VALUES SELECT * FROM Foo
  -- which is a standalone INSERT statement followed by a standalone SELECT statement.

Я могу сделать то, что я должен сделать другой путь, но очевидное отсутствие непротиворечивости в поддержке вырожденных случаев удивляет меня.

Я прочитал соответствующие разделы BOL и ничего не видел. Я был удивлен ничего не придумать через Google также.

6
задан Community 23 May 2017 в 12:18
поделиться

7 ответов

Это одно существенное ограничение SQL и одна из причин, почему SQL не является реляционно полным.

Как вы, возможно, знаете, Хью Дарвен придумал названия DUM и DEE для двух отношений нулевой степени. В SQL нет их эквивалента.

6
ответ дан 8 December 2019 в 18:32
поделиться

Нет, то, о чем вы просите, невозможно. SQL - это язык запросов , и вы ничего не запрашиваете в своем желаемом поведении. Независимо от того, извлекаете ли вы фактические данные таблицы в своем запросе, не имеет значения, но вы должны получить некоторые данные. В вашем примере COUNT (*) вы (очевидно) получаете счетчик.

Единственный способ сделать именно то, что вы хотите, - это запросить количество строк, которые вас интересуют (например, COUNT (1) в желаемом предложении WHERE ) , затем переберите пустой одиночный оператор вставки, который вы использовали в своем примере это количество раз. Для этого не существует однозначного решения.

2
ответ дан 8 December 2019 в 18:32
поделиться

Попробуйте

INSERT INTO Bar SELECT * FROM Foo

вместо

INSERT INTO Bar () SELECT * FROM Foo

Однако тип данных и количество столбцов должны совпадать (на самом деле типы данных должны иметь возможность неявного преобразования)

Или вы хотите, чтобы это ?

CREATE TABLE Bar (id INT NOT NULL IDENTITY PRIMARY KEY)
INSERT INTO Bar DEFAULT VALUES

или

CREATE TABLE Sequence2 (ID INT IDENTITY not null PRIMARY KEY,
            Somedate DATETIME DEFAULT GETDATE() not null,
            SomeID INT DEFAULT 0 not null)
GO

INSERT INTO Sequence2 DEFAULT VALUES

См. Также: Как вставить значения в таблицу, содержащую только столбец идентификаторов

1
ответ дан 8 December 2019 в 18:32
поделиться

Нет. В избранном должен быть хотя бы один столбец.

Я наткнулся на это, потому что хотел вставить несколько строк без указания любые данные столбца для любого из них. например (SQL Server 2005)

А, мне кажется, я понимаю вашу цель здесь. Вы хотите вставить «строки-заполнители» без фактических значений (в любой столбец), и эти столбцы будут заполнены позже.

Нет, это невозможно. Даже если бы нужно было вставить 5 «полностью пустых» строк, как бы вы обновили их позже? (если вам не на что ссылаться в предложении WHERE)

Я называю это «мышлением в виде электронных таблиц». SQL - это не электронная таблица, это база данных.

Я бы просто сделал искусственный ключ (INT с идентификатором), а потом проигнорировал бы его, если он вам не нужен.

1
ответ дан 8 December 2019 в 18:32
поделиться
Declare @count as int
select @count = count(*) from mytable
select @count
create table #test (test int identity)
while @count>0
Begin
insert into #test default values
set @count= @count-1
ENd

select * from #test

Вы получите то, что вам нужно?

0
ответ дан 8 December 2019 в 18:32
поделиться

Если я правильно помню, SELECT NULL FROM table_name; является допустимым синтаксисом, но я не помню, считается ли это нулевым столбцом или одним столбцом (содержащим NULL для каждой строки).

0
ответ дан 8 December 2019 в 18:32
поделиться

Нет, это ограничение SQL. SQL имеет много недостатков, противоречий и асимметрий. К сожалению, он не является математически точным и полным, в отличие от реляционной теории и алгебры, которыми он был вдохновлен и предназначен для работы.

3
ответ дан 8 December 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: