根据条件将一个表复制到另一个表

本文关键字:一个 复制 另一个 条件 | 更新日期: 2023-09-27 18:04:10

在下面的程序中,我将从MBRHISTDETL中选择的每个记录写入到一个数据表中。但是,每当从MBRHISTDTL文件中读取一条记录时,我希望在将其写入数据表之前执行更多操作。但是,程序的编写方式是,当我只想写入特定记录时,它将把整个结果集写入数据表。我怎样才能改变这一点?我想做的是:

  1. 从MBRHISTDETL
  2. 中选择一条记录
  3. 是BILLTYPE 09还是BILLMOYR <> 9999?是,继续。如果没有,重新记录。
  4. 使用MBRHISTDETL中的MBRNUM从LOCINFODETL中获取LOCATION, DISTRICT和CYCLE。
  5. DISTRICT和CYCLE是否匹配输入参数cbDistrict和cbCycle?如果没有,重新记录
  6. 填充datatable
  7. 返回1,除非文件结束。

由于我的代码是现在写的,我只能完成步骤1到3,因为我还没有想出一种方法,从MBRHISTDETL抓取记录,并使用该信息从LOCINDODETL选择另一条记录,以验证我的记录是正确的,然后再写入数据表。基本上,我试图从两个不同的数据库文件中获取信息,并将信息写入数据表。我这样做对吗?

下面是目前为止的代码:
private void btnGo_Click(object sender, EventArgs e)
    {
        //get parameters
        string cycle = cbCycle.Text;
        string district = cbDistrict.Text;
        //create a connection to the database
        OdbcConnection DbConnection = new OdbcConnection("DSN=UPN2;uid=xxxx;pwd=xxxx");
        DbConnection.Open();
        //create a command to extract the required data and
        //assign it to the connection string
        OdbcCommand DbCommand = DbConnection.CreateCommand();
        DbCommand.CommandText = "SELECT * FROM CAV_MBRHISTDETL WHERE BILLTYPE = '09' " +
            "AND BILLMOYR <> '9999'";
        //Create a DataAdapter to run the command and fill the datatable
        OdbcDataAdapter da = new OdbcDataAdapter();
        da.SelectCommand = DbCommand;
        DataTable dt = new DataTable();
        //Put results into datatable.
        da.Fill(dt);

        tbOutput.Text = PrintDataTable(dt);
        DbCommand.Dispose();
        DbConnection.Close();
    }

根据条件将一个表复制到另一个表

如果MBRNUM是LOCINFODETL中的外键,那么您只需要从MBRHISDETL中获取所需的mrbrnum。尝试子选择:

SELECT MBRNUM, LOCATION, DISTRICT, CYCLE
from
    CAV_LOCINFODETL
WHERE
    MBRNUM IN (SELECT MBRNUM
               FROM CAV_MBRHISTDETL
               WHERE BILLTYPE = '09' AND BILLMOYR <> '9999')

如果表在同一个数据库中,您可能(取决于数据库后端和配置)可以使用内部连接在单个查询中获取所有数据。例如:

DbCommand.CommandText = 
 @"SELECT HIST.Field1, HIST.Field2, LOCINFO.Field3 FROM CAV_MBRHISTDEL AS HIST
   INNER JOIN LOCINFODETL AS LOCINFO ON HIST.MBRNUM = LOCINFO.MBRNUM 
   WHERE LOCINFO.CYCLE = @CYCLE AND
         LOCINFO.DISTRICT = @DISTRICT AND
         HIST.BILLTYPE = '09' AND
         HIST.BOLLMOYR <> '9999'";
DbCommand.Parameters.AddWithValue("@CYCLE", cycle);
DbCommand.Parameters.AddWithValue("@DISTRICT", district);

这就完成了步骤1、2、3、4和6,这些步骤都与选择所需的数据有关。步骤5只需要执行命令来填充数据表。(注意:将Field1、Field2等替换为数据表和LOCINFO所需的实际字段。带LOCINFO的MBRNUM。(以LOCINFODETL中对应MBRNUM的字段为准)

如果SQL查询语法不清楚,您可能需要引用内部连接、参数化查询和表别名来获取更多语法信息。

基本上,我正试图从两个不同的数据库中获取信息文件并将信息写入数据表

我假设数据库表在同一个数据库中。我会在查询语句中使用联合将两个表链接到一个公共键。关于如何建立这种关系,有很多例子。