如何使用外连接跳转到表到表 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 次以获取我想要的字段的主要内容,如果未能解决你的问题,请参考以下文章
Firestore是否提供更多的锁定事务,比如表到表的概念?
如何使用 Ajax 获取 MVC Json 结果并填充到表中
Oracle 程序:从表 A 中读取,如果没有找到,则转到表 B