2012-04-09 37 views
7

Tôi đã có một cái nhìn tại câu hỏi này: Getting random value from a SQLite table và nó đã cho tôi tự hỏi nếu một trong những bản sao có thể lặp lại bằng cách sử dụng SQL. Cụ thể hơn, là có một cấu trúc cho phép chuyển những hồ sơ này:Làm thế nào SQL có thể tạo bản ghi trùng lặp?

id| name| count 
--------------- 
1| Anne|  3 
2| Joe|  2 

thành:

id| name 
-------- 
1| Anne 
1| Anne 
1| Anne 
2| Joe 
2| Joe 

nơi đếm AnneJoe bản ghi trong thứ hai phù hợp với count giá trị tương ứng trong tập cũ hồ sơ.

Nó có thể được thực hiện với SQL không? Nếu vậy, làm thế nào?

EDIT:

Lucero hỏi những gì phương ngữ SQL; bất kỳ thực sự, nhưng lý tưởng nhất là cách tiếp cận độc đoán nhất sẽ là cách tốt nhất.

KHÁC EDIT:

Nó có thể được thực hiện trong vòng một câu lệnh SQL duy nhất trong tiếng nói SQLite?

+1

Câu trả lời ngắn gọn là ** Có, nó có thể được thực hiện ** :) –

+0

Ghi đè, tôi đã cập nhật câu hỏi của mình ;-) –

+1

Tại sao bạn muốn? Bạn sẽ làm gì với tập dữ liệu kết quả? –

Trả lời

8

Bạn có thể sử dụng một "số" bảng (rất thuận tiện cho các hoạt động khác nhau):

CREATE TABLE num 
(i UNSIGNED INT NOT NULL 
, PRIMARY KEY (i) 
) ; 

INSERT INTO num (i) 
VALUES 
    (1), (2), ..., (1000000) ; 

Sau đó:

SELECT 
    t.id, t.name 
FROM 
     tableX AS t 
    JOIN 
     num 
      ON num.i <= t."count" 

Warning: Có tất nhiên một hạn chế trên cách tiếp cận này. Truy vấn sẽ không tạo ra tất cả các hàng mong muốn, ngay sau khi bạn có một giá trị trong cột count vượt quá giá trị tối đa được lưu trữ trong bảng số. Nếu các giá trị trong cột count không bị chặn, thì chỉ có một giải pháp lặp lại hoặc đệ quy (giống như hai câu trả lời khác) có thể hoạt động.

+0

Ha đẹp tham gia vào tất cả các bản ghi 'num' với' i <= count' –

+0

+1 : Giải pháp tốt đẹp nên đi du lịch độc đáo. –

2

Điều này có thể được thực hiện bằng một CTE đệ quy:

;WITH CTE_Data as (
    select id=1, name='Anne',[COUNT]=3 
    union select id=2, name='Joe',[COUNT]=2 
), 
CTE_List as (
    select 
     id, 
     name, 
     ind=1 
    from CTE_Data 
    union all 
    select 
     l.id, 
     l.name, 
     ind=ind+1 
    from CTE_List l 
     join CTE_Data d on l.id = d.id 
    where 
     l.ind < d.[count] 
) 
select id,name from CTE_List 
order by id,ind 

LƯU Ý: CTE_List là một trong những thú vị, CTE_Data chỉ là nguồn dữ liệu để thử nghiệm.

4

Phương ngữ và phiên bản SQL nào? Nó có thể háo hức được thực hiện với một CTE đệ quy.

WITH cte AS (
    SELECT id, name, count FROM tbl 
    UNION ALL 
    SELECT id, name, count-1 FROM cte WHERE count>1 
) 
SELECT id, name FROM cte 
Các vấn đề liên quan