-2

マスターのすべての行について、関連する行を詳細テーブルに複製したいと考えています。

例:
マスター テーブルは次のとおりです。

PK   | Data
--------------
1    |  A
2    |  B
3    |  C

詳細表は次のとおりです。

PK    | FK     | Data
---------------------
1     | 1      | AA
2     | 1      | BB
3     | 1      | CC

SQLクエリが実行された後:
詳細テーブルは次のとおりです。

PK    | FK     | Data
---------------------
1     | 1      | AA
2     | 1      | BB
3     | 1      | CC
1     | 2      | AA
2     | 2      | BB
3     | 2      | CC
1     | 3      | AA
2     | 3      | BB
3     | 3      | CC
4

4 に答える 4

1

出力で指定したのは Cross Join (http://en.wikipedia.org/wiki/Join_%28SQL%29#Cross_join) であり、通常は「悪い考え」です。

通常、返されるデータを制限するために、少なくとも 1 つの WHERE 句が必要です。テーブルが大きくなると、得られる結果が急速に大きくなります。返される行数は、2 つのテーブルのサイズの積になります。

于 2012-08-13T12:13:34.323 に答える
1

詳細テーブルは次のようになっていると思います(FKデータは1,2,3の代わりにする必要があります1,1,1

PK | FK | データ
---------------
1 | 1 | AA
2 | 2 | BB
3 | 3 | CC

次のようにクエリできます。

SELECT detail.* FROM master, detail

このSQLFiddleを参照してください

于 2012-08-13T12:17:01.577 に答える
0
</pre><code>
Create database:
USE [t]
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[detail](
    [PK] [int] IDENTITY(1,1) NOT NULL,
    [FK] [int] NULL,
    [Data] [varchar](20) NULL,
 CONSTRAINT [PK_detail] PRIMARY KEY CLUSTERED 
(
    [PK] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[detail]  WITH CHECK ADD  CONSTRAINT [FK_detail_master] FOREIGN KEY([FK])
REFERENCES [dbo].[master] ([PK])
GO

ALTER TABLE [dbo].[detail] CHECK CONSTRAINT [FK_detail_master]
GO

//Create master table:

USE [t]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[master](
    [PK] [int] IDENTITY(1,1) NOT NULL,
    [Data] [varchar](20) NULL,
 CONSTRAINT [PK_master] PRIMARY KEY CLUSTERED 
(
    [PK] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO


//Create detail table:

USE [t]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create procedure [dbo].[douplicate]
 @source int,
 @des int
as
begin
insert into dbo.detail(FK,Data)
SELECT     @des,dbo.detail.Data
FROM         dbo.detail INNER JOIN
                      dbo.master ON dbo.detail.FK = dbo.master.PK
where fk=@source                  
end

//Insert values:

insert into master values 
  ('A'),
  ('B'),
 ('C')

insert into detail  values
  (1,'AA'),
  (2,'BB'),
  (3,'CC')

//Create procedure and solotioanswer:

USE [t]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create procedure [dbo].[douplicate]
 @source int,
 @des int
as
begin
insert into dbo.detail(FK,Data)
SELECT     @des,dbo.detail.Data
FROM         dbo.detail INNER JOIN
                      dbo.master ON dbo.detail.FK = dbo.master.PK
where fk=@source                  
end
</code></pre>
于 2012-08-15T13:54:11.623 に答える
0
insert into Detail(PK, FK, Data)
select D.PK, C.PK, D.Data
from Detail as D
  cross join (select PK
              from Master as M
              where M.PK <> 1) as C
where D.FK = 1

SEデータ

于 2012-08-13T12:56:29.373 に答える