cbo_bat_prod_bat.Items.Clear()
conn.Close()
conn.Open()
comm = New SqlCommand("SELECT distinct (production.batch_no) as EMPLOYEE,
production.pdt_id,
production.dpt_id,
department.dpt_name,
trim(sales_batches.prod_batches)
FROM production
join [sales_batches] on trim(sales_batches.prod_batches) != (production.batch_no)
join [department] on department.dpt_id = production.dpt_id
where production.batch_no NOT IN
(
select distinct (trim(sales_batches.prod_batches))
from sales_batches
)
and department.dpt_name = '" & cbo_bat_dpt.Text & "'
and production.pdt_id = '" & cbo_bat_pdt.Text & "'
and production.batch_no NOT LIKE '%" & batch1.Text.Trim & "%'
and production.batch_no NOT LIKE '%" & batch2.Text.Trim & "%'
and production.batch_no NOT LIKE '%" & batch3.Text.Trim & "%'
and production.batch_no NOT LIKE '%" & batch4.Text.Trim & "%'
and production.batch_no NOT LIKE '%" & batch5.Text.Trim & "%'
and production.batch_no NOT LIKE '%" & batch6.Text.Trim & "%'
and production.batch_no NOT LIKE '%" & batch7.Text.Trim & "%'
and production.batch_no NOT LIKE '%" & batch8.Text.Trim & "%'
and production.batch_no NOT LIKE '%" & batch9.Text.Trim & "%'
order by [EMPLOYEE]desc",
conn)
RD = comm.ExecuteReader
While (RD.Read = True)
cbo_bat_prod_bat.Items.Add(RD.Item("EMPLOYEE"))
End While
conn.Close()
我期望有一个不重复的下拉列表
正如我在评论中提到的,这是一个 SQL 问题,您应该首先在 SSMS 中解决它,然后只有在它工作时才将 SQL 复制到您的 VB 项目中。对于像这样的复杂查询,您应该从一个非常简单的查询开始,然后一点一点地构建它,以便您可以看到行为何时发生您不期望的变化。然后您就可以确切地知道是什么变化导致了它,因此您可以调查一些事情。
我们不可能确切地知道发生了什么,因为您对问题的解释不充分,但我们可以做出有根据的猜测。您的 SQL 正在连接多个表,并且您正在从多个表中检索列:
SELECT distinct (production.batch_no) as EMPLOYEE,
production.pdt_id,
production.dpt_id,
department.dpt_name,
trim(sales_batches.prod_batches)
在类似的查询中使用
DISTINCT
将为您提供这些列的不同组合。如果您要联接的任何表之间存在一对多关系,则其中一个表中的一个值很可能会与另一个表中的多个值一起在结果中多次出现。这就是一对多关系的全部意义。
问题是,根据您向我们展示的内容,您实际上只使用了其中一列:
While (RD.Read = True)
cbo_bat_prod_bat.Items.Add(RD.Item("EMPLOYEE"))
End While
如果您只使用其中之一,为什么还要包括其他的呢?如果您只检索实际需要的一列,则
DISTINCT
将仅应用于该列,并且不会包含任何重复项。