Để truy vấn dữ liệu trên nhiều bảng, bạn muốn tham gia các bảng
. Tôi không rõ ràng 100% về mối quan hệ giữa hai bảng của bạn, nhưng nếu MedicalRecordID
là mối quan hệ chính xác, thì truy vấn của bạn sẽ trông giống như sau:
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)
;
Điều này hoạt động nếu có mối quan hệ 1-1 giữa các bảng và nếu luôn có PatientDetails
ghi lại cho từng hóa đơn. If PatientDetails
là tùy chọn, sau đó sử dụng LEFT JOIN
thay vì INNER JOIN
.
CHỈNH SỬA (phản hồi cho nhận xét):
Tôi cá rằng chuyển đổi DateTime trong mệnh đề WHERE của bạn không hoạt động theo cách bạn mong đợi. Giả sử rằng dtpFrom
và dtpTo
là DatePicker
, bạn có thể muốn sử dụng SelectedDate
thuộc tính thay vì Text
. Ngoài ra, tôi thực sự khuyên bạn nên sử dụng các tham số trong truy vấn của bạn hơn là nối các chuỗi. Mã của bạn sẽ sạch hơn và bạn sẽ tránh được chèn SQL
. Đây là một ví dụ nhanh:
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
}
}