SQL语句(插入/加入/联盟全部???)

时间:2012-05-23 10:55:00

标签: sql sql-server sql-server-2008 sql-server-2005

早上好,

我有两个网页表单(WeeklyAgenda& MonthlyAgenda),其中包含会议记录,这些会议都是我数据库中的单独表格。这些网页还使用户能够将操作添加到我的数据库中的操作表中。

会议记录和操作在更新数据时都分配了一个单独的按钮。 “操作”区域允许用户仅添加三个字段(“操作”,“所有者”和“目标日期”)。

My Actions表包含我想填充的其他列(AgendaID,AgendaDate,AgendaTypeDescription和ActionStatusID)。这些附加列已在网页上提供,因为它们是用户已填写的议程表单的一部分。

我不想再将这些字段添加到我的操作区域并让用户再次添加这些字段,而是希望通过尝试获取已经存在的这些字段(AgendaID,AgendaDate,AgendaTypeDescription和ActionStatusID)来节省自己和Joe Bloggs的时间添加了两个议程表并提取它们并以其他方式导入它们(Action,Owner和Targetdate)并将它们添加到操作表中。

基本上,数据已经存在,但在三个表格中分布。

我一直在尝试在存储过程中在这些表之间建立连接,以便将额外的文件插入到Actions表中。

我不太确定如何完成此操作,并尝试了所有联盟和UNION,但没有设法让这个工作?

我知道我需要从WeeklyAgenda表和MonthlyAgenda表中加入AgendaID,AgendaDate和AgendaTypeDescription。

这是我目前为止的动作表存储过程的代码(没有附加字段的情况下工作)...

 ALTER PROCEDURE [dbo].[Add_Action_Insert]
     @ActionID INT OUTPUT,
@Action VARCHAR(MAX),
     @Owner VARCHAR(50),
     @TargetDate DATETIME
 AS
 INSERT INTO Action (
                    Action,
          Owner,
               TargetDate)                  
    VALUES (
        @Action,
        @Owner,
        @TargetDate)
    SELECT @ActionID = scope_identity()

这就是我想把它改成......

   Alter PROCEDURE [dbo].[Add_Action_Insert_Test]
     @ActionID INT OUTPUT,
@AgendaID INT,
@AgendaDate DATETIME,
@AgendaTypeDescription VARCHAR(50),
@Action VARCHAR(MAX),
     @Owner VARCHAR(50),
     @TargetDate DATETIME,
@ActionStatusID INT
  AS
  INSERT INTO Action (
        AgendaID,
        AgendaDate,
        AgendaTypeDescription,
        Action,
        Owner,
        TargetDate,
        ActionStatusID)                 
    VALUES (
        @AgendaID,
        @AgendaDate,
        @AgendaTypeDescription,
        @Action,
        @Owner,
        @TargetDate,
        @ActionStatusID)
    SELECT @ActionID = scope_identity()

这是我现在在数据库中拥有的数据的图像...... What i currently have

这是我在数据库中想要的图像...... What i would like to achieve

我熟悉任何信息并帮助我获得。我只是不确定我是否需要从其他两个单位插入此附加信息或进行连接???

非常感谢提前。 贝蒂

1 个答案:

答案 0 :(得分:0)

我不确定您为什么要将 AgendaDate AgendaTypeDescription 列也分发到 Action 表。这两列应仅保留在 Agenda 表中。然后,当从 Action 表中检索数据时,您将加入 Agenda 表,如下所示:

SELECT ac.AgendaID, ag.AgendaDate, ag.AgendaTypeDescription, ag.Action, ac.Ownder, ac.TargetDate
 FROM MonthlyAgenda AS ag
 JOIN Action AS ac ON ag.AgendaID = ac.AgendaID
UNION
SELECT ac.AgendaID, ag.AgendaDate, ag.AgendaTypeDescription, ag.Action, ac.Ownder, ac.TargetDate
 FROM WeeklyAgenda AS ag
 JOIN Action AS ac ON ag.AgendaID = ac.AgendaID

如果您决定在 Action 表中查看 AgendaDate AgendaTypeDescription ,则至少需要添加参数 @ AgendaID 到Add_Action_Insert_Test过程以识别操作属于哪个议程。

然后你的程序看起来像这样:

ALTER PROCEDURE [dbo].[Add_Action_Insert_Test] 
  @ActionID INT OUTPUT, 
  @AgendaID INT, 
  @Action VARCHAR(MAX), 
  @Owner VARCHAR(50), 
  @TargetDate DATETIME, 
  @ActionStatusID INT 
AS 
INSERT INTO Action ( 
    AgendaID, 
    AgendaDate, 
    AgendaTypeDescription, 
    Action, 
    Owner, 
    TargetDate, 
    ActionStatusID)                  
SELECT
    @AgendaID,
    AgendaDate,
    AgendaTypeDescription,
    @Action, 
    @Owner, 
    @TargetDate, 
    @ActionStatusID
FROM MonthlyAgenda WHERE AgendaID = @AgendaID
UNION
SELECT
    @AgendaID,
    AgendaDate,
    AgendaTypeDescription,
    @Action, 
    @Owner, 
    @TargetDate, 
    @ActionStatusID
FROM WeeklyAgenda WHERE AgendaID = @AgendaID

SELECT @ActionID = scope_identity() 

在此示例中,我假设 WeeklyAgenda MonthlyAgenda 中的 AgendaIDs 的值是分离的。这意味着 MonthlylyAgenda 中的任何 AgendaID 都不会出现在 MonthlyAgenda 中,反之亦然。你可以实现它,例如通过在一个表中使用偶数ID和在另一个表中使用奇数ID(在列的IDENTITY属性上使用一些高级settig)。