【问题标题】:Merging data from 2 tables合并来自 2 个表的数据
【发布时间】:2012-10-08 04:04:42
【问题描述】:

免责声明:这是一个测试/虚拟/假数据库

大家好,我有一个问题,下面是 2 个表结构。当我使用

SELECT CONVERT(char(80), InvDate,3) AS InvDate,InvoiceNo,EmployerCode,TaxAmount + SubTotal AS Amount,'' AS Payment FROM dbo.Invoice;

我希望在患者姓名栏中添加将被标记为发票编号的列。所以我的意思是,当查询被执行时,它应该向我显示与发票号码一起标记的患者详细信息。但是在这两个表结构中都没有链接。我能想到的唯一链接是“MedicalRecordID”。我尝试使用 UNION 函数并没有给我想要的输出。有什么帮助吗?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;


namespace MedicalDataExporter
{
public partial class frmSales : Form
{
    public frmSales()
    {
        InitializeComponent();
    }


    private void dtpFrom_ValueChanged(object sender, EventArgs e)
    {

    }

    private void btnExtract_Click(object sender, EventArgs e)
    {

        SqlConnection objConn = new SqlConnection("Data Source=test;Initial Catalog=test;Persist Security Info=True;User ID=test;Password=test");

       System.Data.SqlClient.SqlConnection(conStr);
        objConn.Open();

        SqlCommand objCmd = new SqlCommand("SELECT CONVERT(char(80), InvDate,3) AS InvDate,InvoiceNo,EmployerCode,TaxAmount + SubTotal AS Amount,'' AS Payment FROM Invoice WHERE (InvDate >= CONVERT(datetime, '"+dtpFrom.Text +"', 105 )) AND (InvDate <= CONVERT(datetime, '"+dtpTo.Text+"', 105))", objConn);

        SqlDataReader objReader;
        objReader = objCmd.ExecuteReader();

        System.IO.FileStream fs = new System.IO.FileStream("C:\\CMSExportedData\\Sales-" + DateTime.Now.ToString("dd-MM-yyyy") + ".txt", System.IO.FileMode.Create);
        System.IO.StreamWriter sw = new System.IO.StreamWriter(fs, System.Text.Encoding.Default);

        int count = 0;
        while (objReader.Read())
        {

            for (int i = 0; i < 5; i++)
            {
                if (!objReader.IsDBNull(i))
                {
                    string s;
                    s = objReader.GetDataTypeName(i);
                    //MessageBox.Show(s);
                    if (objReader.GetDataTypeName(i) == "char")
                    {
                        sw.Write(objReader.GetString(i));
                    }
                    else if (objReader.GetDataTypeName(i) == "money")

                    {
                        sw.Write(objReader.GetSqlMoney(i).ToString());
                    }
                    else if (objReader.GetDataTypeName(i) == "nvarchar")
                    {
                        sw.Write(objReader.GetString(i));
                    }
                }
                if (i < 4)
                {
                    sw.Write("\t");
                }

            }
            count = count + 1;
            sw.WriteLine();

        }
        sw.Flush();
        fs.Close();
        objReader.Close();
        objConn.Close();
        MessageBox.Show(count + " records exported successfully.");
        this.Close();
    }

    private void groupBox1_Enter(object sender, EventArgs e)
    {

    }

    private void dtpTo_ValueChanged(object sender, EventArgs e)
    {

    }

    private void frmSales_Load(object sender, EventArgs e)
    {

    }
}
}

这是表结构:

这是第二个表结构:

【问题讨论】:

    标签: c# sql visual-studio-2010 sql-server-2008


    【解决方案1】:

    要跨多个表查询数据,您需要join the tables。我不是 100% 清楚你的两个表之间的关系,但如果 MedicalRecordID 是正确的关系,那么你的查询应该是这样的:

    SELECT
        CONVERT(char(80), i.InvDate,3) AS InvDate,
        i.InvoiceNo,
        i.EmployerCode,
        i.TaxAmount + i.SubTotal AS Amount,
        '' AS Payment,
        pd.LastName,
        pd.GivenName
    FROM
        dbo.Invoice i
            INNER JOIN dbo.PatientDetails pd ON (pd.MedicalRecordID = i.MedicalRecordID)
    ;
    

    如果表之间存在一对一的关系,并且每张发票始终有 PatientDetails 记录,则此方法有效。如果PatientDetails 是可选的,则使用LEFT JOIN 而不是INNER JOIN

    编辑(回复评论):

    我敢打赌,您的 WHERE 子句中的 DateTime 转换没有按您期望的方式工作。假设dtpFromdtpToDatePicker 控件,您可能希望使用SelectedDate 属性而不是Text。此外,我强烈建议您在查询中使用参数,而不是连接字符串。你的代码会更干净,你会避免SQL injection。这是一个简单的例子:

    using (SqlConnection connection = new SqlConnection( ... ))
    {
        connection.Open();
    
        string sql = @"
                    SELECT
                        CONVERT(char(80), i.InvDate,3) AS InvDate,
                        i.InvoiceNo,
                        i.EmployerCode,
                        i.TaxAmount + i.SubTotal AS Amount,
                        '' AS Payment,
                        pd.GivenName
                    FROM
                        dbo.Invoice i
                            LEFT JOIN dbo.PatientDetails pd ON (pd.MedicalRecordID = i.MedicalRecordID)
                    WHERE
                        InvDate >= @fromDate AND InvDate <= @toDate";
    
        SqlCommand cmd = new SqlCommand(sql, connection);
        cmd.Parameters.AddWithValue("@fromDate", dtpFrom.SelectedDate);
        cmd.Parameters.AddWithValue("@toDate", dtpTo.SelectedDate);
    
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            // do stuff with results
        }
    }
    

    【讨论】:

    • 感谢您的回复。当我执行查询 MSSQL 时,它完全符合我的要求。但是当我转移到 vb 命令时,它并没有显示 MSSQL 中显示的内容。 SqlCommand objCmd = new SqlCommand("SELECT CONVERT(char(80), i.InvDate,3) AS InvDate, i.InvoiceNo, i.EmployerCode,i.TaxAmount + i.SubTotal AS Amount,'' AS Payment, pd.GivenName FROM dbo.Invoice i LEFT JOIN dbo.PatientDetails pd ON (pd.MedicalRecordID = i.MedicalRecordID) WHERE (InvDate &gt;= CONVERT(datetime, '" + dtpFrom.Text + "', 105 )) AND (InvDate &lt;= CONVERT(datetime, '" + dtpTo.Text + "', 105))", objConn);
    • 您好,先生,经过 6 小时的编码和帮助调整。它不按日期过滤,并且 patientdetails.givenname 未显示在 txt 输出中
    • 我会将上述查询从 C# 复制/粘贴到 Management Studio(复制/粘贴引号内的所有内容,而不更改引号内的任何内容),然后在查询前添加两个变量声明 (DECLARE @fromDate DATETIME = '2012-10-01 00:00'DECLARE @toDate DATETME = '2012-10-11 00:00')。如果查询在 Management Studio 中有效,则返回 C# 代码并设置断点并检查两个 SelectedDate 字段以确认它们是正确的。如果查询在 Management Studio 中没有产生预期的结果,那么您需要处理该查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2019-01-16
    • 1970-01-01
    • 2021-12-17
    • 2016-04-29
    • 2013-11-25
    相关资源
    最近更新 更多