2010-06-03 77 views
5

Tôi hy vọng câu hỏi này giá vé tốt hơn một chút so với Create a table without columns tương tự. Vâng, tôi đang hỏi về điều gì đó sẽ tấn công nhất là học tập vô nghĩa.Tôi có thể chọn 0 cột trong SQL Server không?

Thật dễ dàng để tạo kết quả SELECT với 0 hàng (nhưng có cột), ví dụ: SELECT a = 1 WHERE 1 = 0.

Có thể tạo kết quả SELECT bằng 0 cột (nhưng có hàng) không? ví dụ: một cái gì đó như SELECT NO COLUMNS FROM Foo. (Đây không phải là T-SQL hợp lệ.)

Tôi bắt gặp điều này vì tôi muốn chèn nhiều hàng mà không chỉ định bất kỳ dữ liệu cột nào cho bất kỳ dữ liệu nào trong số chúng. ví dụ. (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. 

Có thể chèn một hàng duy nhất mà không chỉ định bất kỳ dữ liệu cột nào, ví dụ: INSERT INTO Foo DEFAULT VALUES.

Người ta có thể truy vấn để đếm số hàng (không truy xuất dữ liệu cột thực tế từ bảng), ví dụ: SELECT COUNT(*) FROM Foo. (Nhưng đó tập kết quả, tất nhiên, có một cột.)

tôi đã cố gắng những thứ như

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. 

tôi có thể làm những gì tôi cần phải làm một cách khác nhau, nhưng sự thiếu nhất quán trong việc hỗ trợ cho các trường hợp thoái hóa làm tôi ngạc nhiên.

Tôi đọc qua các phần có liên quan của BOL và không thấy bất kỳ điều gì. Tôi cũng ngạc nhiên khi không tìm được gì thông qua Google.

+5

Tất cả những gì bạn cần làm là tạo cơ sở dữ liệu mà không cần tạo cơ sở dữ liệu. Phần còn lại là khá dễ dàng. –

+4

"sự thiếu nhất quán trong việc hỗ trợ cho các trường hợp thoái hóa"? Nó có vẻ hoàn toàn phù hợp - cột phải có mặt. Bạn có thực sự có nghĩa là "không có khả năng hỗ trợ các trường hợp cụ thể của bạn"? –

+3

Tôi sẽ không gọi đây là "học tập vô nghĩa" - "điên" sẽ phù hợp hơn. –

Trả lời

6

Đây là một hạn chế đáng kể của SQL và một lý do tại sao SQL không hoàn toàn liên quan.

Như bạn có thể biết, Hugh Darwen đã phát minh ra tên DUM và DEE cho hai mối quan hệ 0 độ. SQL không có tương đương với chúng.

+0

Tại sao đây là một hạn chế đáng kể? Trong hoàn cảnh nào bạn cần điều này? –

+4

Nó làm cho SQL ít mạnh hơn so với đại số quan hệ.Hay nói cách khác, trong SQL không phải tất cả các kết quả đều có thể thu được bằng các biểu thức quan hệ một mình và ngôn ngữ ít trực giao và phức tạp hơn. Ví dụ, SQL sử dụng toán tử EXISTS để kiểm tra sự tồn tại của một hàng và chuyển đổi một tập kết quả thành một giá trị true hoặc false. Toán tử EXISTS đó chỉ hợp lệ ở một số vị trí nhất định trong truy vấn. Trong khi đó, trong các thuật ngữ quan hệ bạn chỉ có thể viết "PROJECT (..) R" để có được một mối quan hệ không bằng 0 hoặc 1 tuple, sau đó tham gia gọn gàng vào bất kỳ phần nào khác của truy vấn. – sqlvogel

+3

Phím trống hữu ích cho các bảng hàng đơn của các biến hoặc hằng số chỉ cần thiết lập một lần cho mỗi cơ sở dữ liệu. Trong SQL, bạn phải tạo một cột giả và/hoặc một ràng buộc CHECK để thực thi một khóa chỉ cho phép một hàng duy nhất. Hỗ trợ cho các khóa rỗng được yêu cầu hoàn toàn nếu bạn muốn đạt được Biểu mẫu thông thường thứ 2 để đáp ứng các FD như {} -> {A}. – sqlvogel

1

Hãy thử

INSERT INTO Bar SELECT * FROM Foo 

thay vì

INSERT INTO Bar() SELECT * FROM Foo 

Tuy nhiên các kiểu dữ liệu và số cột cần phải phù hợp (trên thực tế các kiểu dữ liệu cần để có thể mặc nhiên chuyển đổi)

Hoặc làm bạn muốn điều này?

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

hoặc

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 

Xem thêm: How to insert values into a table with only an identity column

+1

Ông đặc biệt liệt kê trường hợp đó trong câu hỏi của mình. Tại sao bạn nghĩ rằng điều này trả lời câu hỏi của mình ...? –

2

Không, những gì bạn đang yêu cầu là không thể. SQL là một ngôn ngữ truy vấn và bạn đang truy vấn chính xác không có gì trong hành vi mong muốn của mình. Cho dù bạn có đang truy xuất dữ liệu bảng thực tế trong truy vấn của mình hay không, nhưng bạn phải truy xuất một số dữ liệu. Trong ví dụ COUNT(*) của bạn, bạn (rõ ràng) đang truy xuất số lượng.

Cách duy nhất để thực hiện chính xác những gì bạn muốn là truy vấn số hàng bạn quan tâm (ví dụ: COUNT(1) trên mệnh đề WHERE mong muốn), sau đó lặp lại câu lệnh chèn đơn trống mà bạn đã sử dụng ví dụ cho số lần đó.Không có cách nào để nói về điều này.

0

Nếu tôi nhớ chính xác, SELECT NULL FROM table_name; là cú pháp hợp lệ, nhưng tôi không nhớ liệu điều này được tính là có 0 cột hay một cột (có chứa NULL cho mỗi hàng).

+2

Đây sẽ là một cột, với giá trị cho mỗi hàng là 'NULL'. –

3

Không có giới hạn về SQL. SQL có rất nhiều mụn cóc, mâu thuẫn và bất đối xứng. Thật không may là toán học không chính xác hoặc hoàn toàn không giống như lý thuyết và đại số quan hệ nó được lấy cảm hứng từ và có nghĩa là được sử dụng để làm việc cùng.

+0

Tôi không chắc chắn nên đưa ra câu trả lời nào. Chắc chắn, SQL không hoàn hảo, nhưng nó là một công cụ, và tôi không tin rằng nó đã từng được * thiết kế * hoặc thậm chí * hình thành * để làm "toán học lý thuyết chính xác hoặc đầy đủ và đại số". Có lẽ bạn đã có cái nhìn sâu sắc hơn về những gì áp phích orignal đang cố gắng thực hiện ở đây. – BradC

0
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 

Điều này có giúp bạn không cần thiết không?

1

Không. Lựa chọn phải có ít nhất một cột.

Tôi gặp vấn đề này vì tôi muốn chèn nhiều hàng mà không chỉ định bất kỳ dữ liệu cột nào cho bất kỳ cột nào trong số đó. ví dụ. (SQL Server 2005)

Ah, tôi nghĩ tôi hiểu mục tiêu của bạn ở đây. Bạn muốn chèn "hàng giữ chỗ" không có giá trị thực tế (trong bất kỳ cột nào), và các cột đó sẽ được điền vào thời gian sau đó.

Không, điều này là không thể. Ngay cả khi nó đã chèn 5 hàng "hoàn toàn trống", bạn sẽ cập nhật chúng sau này như thế nào? (nếu bạn không có gì để tham chiếu trong mệnh đề WHERE)

Tôi gọi đây là "tư duy bảng tính". SQL không phải là một bảng tính, nó là một cơ sở dữ liệu.

Tôi chỉ cần tạo một chìa khóa nhân tạo (INT với danh tính), và sau đó bỏ qua nó sau này nếu nó không phục vụ cho bạn.

Các vấn đề liên quan