Unione di dati da 2 tabelle

DICHIARAZIONE DI NON RESPONSABILITÀ: QUESTO È UN DATABASE DI PROVA / DUMMY / FAKE

Ciao ragazzi, ho un problema, sotto ci sono le 2 strutture del tavolo. Quando lo uso

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

http://sofit.miximages.com/c%23/icpzpy.png

Desidero aggiungere in una colonna il nome del paziente dove sarà taggato al numero della fattura. Quindi, quello che voglio dire è che, quando la query viene eseguita, dovrebbe mostrarmi i dettagli del paziente taggati insieme al numero della fattura. Ma in entrambe le strutture della tabella non ci sono collegamenti. L’unico collegamento che posso pensare a “MedicalRecordID”. Ho provato a utilizzare la funzione UNION non mi ha dato l’output desiderato. Qualsiasi aiuto?

 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) { } } } 

Ecco la struttura della tabella:

http://sofit.miximages.com/c%23/2cwu2j6.png

Ecco la 2a struttura della tabella:

http://sofit.miximages.com/c%23/29yplvl.png

Per eseguire query di dati su più tabelle, si desidera unire le tabelle . Non sono al 100% chiaro sulla relazione tra le due tabelle, ma se MedicalRecordID è la relazione corretta, la query dovrebbe essere simile a questa:

 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) ; 

Ciò funziona se esiste una relazione uno-a-uno tra le tabelle e se c’è sempre un record PatientDetails per ciascuna fattura. Se PatientDetails è opzionale, utilizzare LEFT JOIN invece di INNER JOIN .

EDIT (risposta al commento):

Scommetto che la conversione DateTime nella tua clausola WHERE non funziona come ti aspetti. Supponendo che dtpFrom e dtpTo siano controlli DatePicker , probabilmente si desidera utilizzare la proprietà SelectedDate anziché Text . Inoltre, raccomando vivamente di utilizzare i parametri nelle tue query piuttosto che concatenare le stringhe. Il codice sarà più pulito e eviterete l’ iniezione SQL . Ecco un rapido esempio:

 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 } }