【发布时间】:2017-04-21 16:03:53
【问题描述】:
我正在尝试运行 2 个SELECT 查询。第一个查询从Supplier_Product_Pricing 中选择所选客户和供应商匹配的所有数据。这会填写DataTable,并显示供应商、产品和价格。这个很好用。
我尝试执行的下一个查询应该是从Product Suppliers 中选择供应商与所选供应商匹配的所有产品,但在Supplier_Product_Pricing 中没有为所选客户提供价格。
基本上,我想从 2 个表中加载数据,其中一组记录在所选客户和供应商之间达成了一致的价格,然后将其与第二组数据(该供应商的剩余产品)连接起来,没有约定的价格。
以下是我用来执行此操作的代码:
Try
sql = "SELECT * FROM [Supplier_Product_Pricing] WHERE [Customer_Code] = @ccode AND " & _
"[Supp_Code] = @scode ORDER BY [Product_Code]"
cmd = New OleDb.OleDbCommand(sql, con)
With cmd.Parameters
.AddWithValue("@ccode", cust)
.AddWithValue("@scode", cmbSuppCode.Text)
End With
Dim da As New OleDb.OleDbDataAdapter(cmd)
Dim dt As New DataTable
da.Fill(dt)
Dim i As Integer = dt.Rows.Count
Dim ds As New DataSet
Using da2 As New OleDbDataAdapter("SELECT * FROM [Product Suppliers] WHERE " & _
"[Supplier_Code] = ? AND [Product_Code] NOT IN " & _
"(SELECT [Product_Code] FROM " & _
"[Supplier_Product_Pricing] WHERE [Customer_Code] = ? " & _
"AND [Supp_Code] = ?) ORDER BY [Product_Code]", con)
With da2.SelectCommand.Parameters
.Add("@scode", OleDbType.VarChar).Value = cmbSuppCode.Text
.Add("@ccode", OleDbType.VarChar).Value = cust
.Add("@supp", OleDbType.VarChar).Value = cmbSuppCode.Text
End With
da2.Fill(ds)
End Using
For Each dr As DataRow In ds.Tables(0).Rows
dt.Rows.Add(dr.Item("Supplier_Code"), dr.Item("Product_Code"), Nothing)
Next
但是这样做的结果是,它会在顶部显示所有约定价格的记录,然后在其下再次显示所有供应商的产品,无论是否有约定的价格。见下文。
如您所见,带有产品价格的 4 行随后在下方重复,但没有价格。
尽管使用了NOT IN 子句,为什么查询返回两个表中的行?
编辑
帮助赏金 - 使用一个参数时,如第一个答案中所建议的那样,根本不会返回任何结果。
当使用 2 个不同的参数时,正如我最初所做的那样,无论我是否使用 DISTINCT,它都会返回与图像中所示相同的结果。
表 [Product Suppliers] - 存储已提供给供应商的所有产品。因此,在给出的示例中,与“JON_B”关联的所有产品都将在此处以“JON_B”作为供应商。 JON_B 的所有产品如下图所示。
表 [Supplier_Product_Pricing]
如您所见,只有 8 个产品链接到 JON_B。当向其中的 4 个添加价格时,它会返回 4 个有价格的,以及所有没有价格的。我只需要显示价格为Supplier_Product_Pricing 的那些,加上Product Suppliers 中没有价格的那些
编辑 2
继续@Bugs 提供的答案
Dim sqlString As String = " SELECT [Product Suppliers].[Supplier_Code], " & _
" [Product Suppliers].[Product_Code], " & _
" [Supplier_Product_Pricing].[Product_Price] " & _
" FROM [Product Suppliers] LEFT OUTER JOIN " & _
" [Supplier_Product_Pricing] ON [Product Suppliers].[Product_Code]=[Supplier_Product_Pricing].[Product_Code] AND " & _
" [Product Suppliers].[Supplier_Code]=[Supplier_Product_Pricing].[Supp_Code] " & _
" WHERE [Product Suppliers].[Supplier_Code] = ? " & _
" AND [Supplier_Product_Pricing].[Customer_Code] = ? " & _
"ORDER BY [Product Suppliers].[Product_Code]"
Dim dt As New DataTable
Dim cmd As New OleDbCommand(sqlString, con)
With cmd.Parameters
.Add(New OleDbParameter("@scode", OleDbType.VarChar)).Value = cmbSuppCode.Text
.Add(New OleDbParameter("@ccode", OleDbType.VarChar)).Value = cust
End With
dt.Load(cmd.ExecuteReader())
ugPricing.DisplayLayout.Bands(0).Override.AllowAddNew = Infragistics.Win.UltraWinGrid.AllowAddNew.No
ugPricing.DataSource = dt
Try
ugPricing.DisplayLayout.Bands(0).Columns("Customer_Code").Hidden = True
Catch
End Try
相关表格中的数据:
[Product Suppliers]
[Supplier_Product_Pricing]
【问题讨论】: