繁体   English   中英

从具有来自同一列的两个条件的表中进行选择的更好方法是什么?

[英]What is the better way to select from table with two condition from the same column?

我一直在尝试选择具有三个条件的数据库,并且这两个条件来自同一列。

我有一个带有 usercontrol 的 flowlayoutpanel,我似乎无法查看同一列中具有不同值的所有数据。

我试过了

SELECT borrowID, studentID, bookTitle, dateBorrowed, dueDate, status  FROM tblBorrowedBook WHERE status = 'Not Returned' AND status = 'Overdue' AND studentNum = @studentNum

但遗憾的是不起作用。

我也试过

    public void BooksOnHand()
    {
        ucBooksOnHand uc = new ucBooksOnHand(this);
        flowLayoutPanel1.Controls.Clear();
        cn.Open();
        cm = new SqlCommand("SELECT borrowID, studentID, bookTitle, dateBorrowed, dueDate, status  FROM tblBorrowedBook WHERE status = 'Not Returned' AND studentNum = @studentNum", cn);
        cm.Parameters.AddWithValue("@studentNum", frmissue.lblStudNo.Text);
        dr = cm.ExecuteReader();
        while (dr.Read())
        {
            //ucBooksOnHand uc = new ucBooksOnHand(this);
            uc.Dock = DockStyle.Top;
            uc.lblBorrowID.Text = dr["borrowID"].ToString();
            uc.lblStudentID.Text = dr["studentID"].ToString();
            uc.lblBookName.Text = dr["bookTitle"].ToString();
            uc.lblDateBorrowed.Text = Convert.ToDateTime(dr["dateBorrowed"]).ToString("MM/dd/yyyy");
            uc.lblDueDate.Text = Convert.ToDateTime(dr["dueDate"]).ToString("MM/dd/yyyy");
            uc.lblStatus.Text = dr["status"].ToString();
            uc.dtDueDate.Value = Convert.ToDateTime(dr["dueDate"]);
            flowLayoutPanel1.Controls.Add(uc);
        }
        dr.Close();
        cn.Close();
    }

    public void BooksOverdue()
    {
        cn.Open();
        cm = new SqlCommand("SELECT borrowID, bookTitle, studentID, dateBorrowed, dueDate, status  FROM tblBorrowedBook WHERE status = 'Overdue' AND studentNum = @studentNum", cn);
        cm.Parameters.AddWithValue("@studentNum", frmissue.lblStudNo.Text);
        dr = cm.ExecuteReader();
        while (dr.Read())
        {
            ucBooksOnHand uc = new ucBooksOnHand(this);
            uc.Dock = DockStyle.Top;
            uc.lblBorrowID.Text = dr["borrowID"].ToString();
            uc.lblStudentID.Text = dr["studentID"].ToString();
            uc.lblBookName.Text = dr["bookTitle"].ToString();
            uc.lblDateBorrowed.Text = Convert.ToDateTime(dr["dateBorrowed"]).ToString("MM/dd/yyyy");
            uc.lblDueDate.Text = Convert.ToDateTime(dr["dueDate"]).ToString("MM/dd/yyyy");
            uc.lblStatus.Text = dr["status"].ToString();
            uc.dtDueDate.Value = Convert.ToDateTime(dr["dueDate"]);
            flowLayoutPanel1.Controls.Add(uc);
        }
        dr.Close();
        cn.Close();
    }

上面的代码对我有用,但我正在为我的问题寻找更好、更简单的解决方案。

这是表中的一些数据

borrowID    studentID   bookID  studentNum      bookTitle   dateBorrowed  dueDate    returnedDate   status
10          1           1       2020-01-0001    Worthless   2020-03-30   2020-04-06  Mar 30 2020    Returned
11          1           1       2020-01-0001    Worthless   2020-03-23   2020-03-27  Mar 30 2020    Returned
12          1           2       2020-01-0001    Heartless   2020-03-30   2020-04-06                 Not Returned
13          1           1       2020-01-0001    Worthless   2020-03-15   2020-03-28                 Overdue

我想展示一个学生的所有书籍,该学生仍未归还且逾期。

我想要的示例输出:

Books In Possesion:

Book Name   Status
----------|-------------
Heartless | Not Returned
Worthless | Overdue

您不能在具有两个不同值的同一列上使用AND 您需要在括号中为这些使用OR ,如下所示:

SELECT ... WHERE (status = 'Not Returned' OR status = 'Overdue') AND studentNum = @studentNum

另一种可能更好的方法是使用 IN 运算符。 如果您有两个以上的项目要检查,当然更好

SELECT ... WHERE status IN('Not Returned', 'Overdue') AND studentNum = @studentNum

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM