如何使用外连接跳转到表到表 2 次以获取我想要的字段

Posted

技术标签:

【中文标题】如何使用外连接跳转到表到表 2 次以获取我想要的字段【英文标题】:How to jump to table to table for 2 times to get the field I want, using outer join 【发布时间】:2014-02-16 16:49:29 【问题描述】:

我有三张表,分别是处方、预约和付款。处方与预约有关系,预约与支付有关系。目前我只能从处方表跳转到预约表并获取 aDate 字段并将其显示在 dategridview 中。现在我需要从处方表跳转到预约表,然后跳转到付款表以获取金额字段。怎么写?

我的日期视图

我的桌子

private void prescription_Load(object sender, EventArgs e)
        
            LoadPrescriptionRecords();
        

        private void LoadPrescriptionRecords()
        

            //retrieve connection information info from App.config
            string strConnectionString = ConfigurationManager.ConnectionStrings["SACPConnection"].ConnectionString;
            //STEP 1: Create connection
            SqlConnection myConnect = new SqlConnection(strConnectionString);
            //STEP 2: Create command

            //string strCommandText = "SELECT prescriptionID, app.aDate FROM PRESCRIPTION AS pres";
            string strCommandText = "SELECT prescriptionID, app.aDate FROM PRESCRIPTION AS pres";
            strCommandText += " LEFT OUTER JOIN appointment as app on pres.appointmentid = app.appointmentid";

            myConnect.Open();

            PrescriptionAdapter = new SqlDataAdapter(strCommandText, myConnect);

            //readMEDICATION.Close();
            myConnect.Close();      

            //command builder generates Select, update, delete and insert SQL
            // statements for MedicalCentreAdapter
            SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(PrescriptionAdapter);
            // Empty Employee Table first
            Prescription.Clear();
            // Fill Employee Table with data retrieved by data adapter
            // using SELECT statement
            PrescriptionAdapter.Fill(Prescription);

            // if there are records, bind to Grid view & display
            if (Prescription.Rows.Count > 0)
                grdPrescription.DataSource = Prescription;         
        

【问题讨论】:

这很容易,这就是为什么我们三个人都在为围栏而战。你需要更多地学习 SQL。我建议在添加 C# 和所有连接类的复杂性之前找到一个像 SSMS 这样的 SQL 工具来运行您的查询。 【参考方案1】:

在您的strCommandText 中再加入一次,即加入预约付款。

string strCommandText = "SELECT prescriptionID, app.aDate, p.amount FROM PRESCRIPTION AS pres ";
strCommandText += "LEFT OUTER JOIN appointment as app on pres.appointmentid = app.appointmentid ";
strCommandText += "LEFT OUTER JOIN payment p on app.appointmentid = p.appointmentid ";

【讨论】:

谢谢,你错过了第一行的 p.amount。 @peter.petrov 谢谢。 erm,通过使用外连接,这意味着我不能在datagridview上执行更新功能吗? @peter.petrov @Jordjmax 当为T1 INNER JOIN T2且T2中没有对应的行时,在返回的结果集中你根本不会得到一行。 @Jordjmax T1 LEFT OUTER JOIN T2 表示即使T2中没有对应的行,返回的结果集中也会有一行;在这种情况下,如果您的 select 子句包含 T2 中的某些列,您将在返回的行中获得它们的 NULL 值。 所以...你的意思是INNER join允许更新datagridview,而outer join不是吗?你的 T 表示列? @peter.petrov【参考方案2】:

只需将它与payment 表连接起来,就像您在另一个表中所做的那样。

SELECT prescriptionID, app.aDate,pay.Amount FROM PRESCRIPTION AS pres
 LEFT OUTER JOIN appointment as app on pres.appointmentid = app.appointmentid
 Left outer join Payment as pay on app.appointmentid = pay.appointmentid

【讨论】:

【参考方案3】:
string strCommandText = "SELECT prescriptionID, app.aDate, P.Amount 
 FROM PRESCRIPTION AS pres 
 LEFT OUTER JOIN appointment as app on pres.appointmentid = app.appointmentid 
 LEFT OUTER JOIN Payment as P on P.appointmentid = pres.appointmentid";

编辑:这很容易,这就是为什么我们三个人要撞到栅栏上。你需要更多地学习 SQL。我建议在添加 C# 和所有连接类的复杂性之前找到一个像 SSMS 这样的 SQL 工具来运行您的查询。 SQL Server Management Studio

【讨论】:

以上是关于如何使用外连接跳转到表到表 2 次以获取我想要的字段的主要内容,如果未能解决你的问题,请参考以下文章

EF简易教程,从建表到表间关系

Firestore是否提供更多的锁定事务,比如表到表的概念?

如何使用 Ajax 获取 MVC Json 结果并填充到表中

Oracle 程序:从表 A 中读取,如果没有找到,则转到表 B

如何使 Kafka 接收器连接器在接收器启动时将数据从主题插入到表中

MS Access 2016:如何将连接字段从表单输入到表中