Vb.net SQL联合错误-所选列不匹配

Vb.net SQL联合错误-所选列不匹配,vb.net,datagridview,inner-join,union,Vb.net,Datagridview,Inner Join,Union,我正在尝试使用SQL联合查询来填充我的DataGridView 我尝试加入的3个表是: 客户-包含客户基本信息主键:客户代码 客户地址-包含联系信息电话、传真、地址等主键:客户代码 交货地址-与客户地址相同,但适用于交货地点主键:客户代码 我试图在DataGridView中显示每个表中的一些数据。我希望能够在每一行上显示每个表中的数据,并使用上面提到的主键连接它 到目前为止,我已经尝试使用内部联接和联合联接进行联接。但是,内部联接不允许我只从两个表中选择一些列,而联合联接给了我以下错误: 联合查

我正在尝试使用SQL联合查询来填充我的DataGridView

我尝试加入的3个表是:

客户-包含客户基本信息主键:客户代码

客户地址-包含联系信息电话、传真、地址等主键:客户代码

交货地址-与客户地址相同,但适用于交货地点主键:客户代码

我试图在DataGridView中显示每个表中的一些数据。我希望能够在每一行上显示每个表中的数据,并使用上面提到的主键连接它

到目前为止,我已经尝试使用内部联接和联合联接进行联接。但是,内部联接不允许我只从两个表中选择一些列,而联合联接给了我以下错误:

联合查询的两个选定表或查询中的列数不匹配

这是我的代码,我做错了什么

ElseIf type = "Customer" Then
 sql = "SELECT [Customer_Code], [Customer_Name], [Customer_Category], " & _
       "[Average_Payment_Terms], [Notes], [Aq_Date], [salesRep], [hoEmail], [webpage] " & _
       "FROM Customers " & _
       "UNION SELECT [Contact_Code], [Contact_Type], [Contact_Name], [Add1], [Add2], " & _
       "[Add3], [Add4], [Add5], [Postcode], [Country], [Telephone], [Fax], " & _
       "[Email], [Mobile_Phone] FROM [Customer_Addresses]"

 Dim da As New OleDbDataAdapter(sql, con)
 Dim ds As New DataSet
 Dim dt As New DataTable

 da.Fill(ds) ' This is the line that the error occurs on
 dt = ds.Tables(0).Copy()
乙二胺四乙酸

我再次尝试使用连接,并使用了以下内容:

ElseIf type = "Customers" Then
   sql = "SELECT Customer_Addresses.Cust_Code, Customers.Customer_Name, " & _
          "Customers.Customer_Category, Customers.Average_Payment_Terms, Customers.Notes, " & _
          "Customers.Aq_Date, Customers.salesRep, Customers.hoEmail, Customers.webpage, " & _
          "Customer_Addresses.Contact_Code, Customer_Addresses.Contact_Name, " & _
          "Customer_Addresses.Contact_Type, Customer_Addresses.Add1, Customer_Addresses.Add2, " & _
          "Customer_Addresses.Add3, Customer_Addresses.Add4, Customer_Addresses.Add5, " & _
          "Customer_Addresses.Postcode, Customer_Addresses.Country, Customer_Addresses.Telephone, " & _
          "Customer_Addresses.Fax, Customer_Addresses.Email, Customer_Addresses.Mobile_Phone " & _
          "FROM Customers AS c INNER JOIN Customer_Addresses AS a ON c.Customer_Code = a.Cust_Code"

   Dim da As New OleDbDataAdapter(sql, con)
   Dim ds As New DataSet
   Dim dt As New DataTable

   da.Fill(ds)
   dt = ds.Tables(0).Copy()

   dgvExport.DataSource = dt
这会导致以下错误

没有为一个或多个必需参数提供值

请改用联接:

sql = "SELECT C.Customer_Code, C.Customer_Name, C.Customer_Category, " & _
   "C.Average_Payment_Terms, C.Notes, C.Aq_Date, C.salesRep, C.hoEmail, C.webpage, A.Contact_Code, A.Contact_Type, A.Contact_Name, A.Add1, A.Add2, " & _
   "A.Add3, A.Add4, A.Add5, A.Postcode, A.Country, A.Telephone, A.Fax, " & _
   "A.Email, A.Mobile_Phone FROM Customers C INNER JOIN Customer_Addresses A ON C.Customer_Code=A.Cust_Code "

首先,您应该为此使用内部联接

其次,要使用内部联接,需要确保希望联接的键在Access中具有它们之间的关系。创建新查询并将Access中的两个表添加到查询时,它将告诉您它们之间没有关系。按下“确定”按钮将进入关系设计器屏幕

从Customers表中选择主键Customer_Code,并将其拖动到其他两个表Custom_Code中的匹配键。这将允许数据库将键连接在一起,而不是请求参数值

查询本身应该是这样的

sql = "SELECT [Customer_Addresses].[Cust_Code], " & _
   "[Customer_Addresses].[Contact_Code], [Customer_Addresses].[Contact_Name], " & _
   "[Customer_Addresses].[Contact_Type], [Customer_Addresses].[Add1], " & _
   "[Customer_Addresses].[Add2], [Customer_Addresses].[Add3], " & _
   "[Customer_Addresses].[Add4], [Customer_Addresses].[Add5], " & _
   "[Customer_Addresses].[Postcode], [Customer_Addresses].[Country]," & _
   "[Customer_Addresses].[Telephone], [Customer_Addresses].[Fax], " & _
   "[Customer_Addresses].[Email], [Customer_Addresses].[Mobile_Phone], " & _
   "[Customers].[Customer_Code], [Customers].[Customer_Category], " & _
   "[Customers].[Average_Payment_Terms], [Customers].[Customer_Name], [Customers].[Notes], " & _
   "[Customers].[Aq_Date], [Customers].[salesRep], " & _
   "[Customers].[hoEmail], [Customers].[webpage] FROM Customers " & _
   "INNER JOIN Customer_Addresses ON [Customers].[Customer_Code] =[Customer_Addresses].[Cust_Code]"
显然,这只适用于两个表,但是一旦您将主键连接到Delivery_Addresses.Cust_代码,那么它也将包括这个表

另一个需要注意的是,如果你有100个客户,比如说,每个客户在客户地址中有一个地址,但只有5个客户在送货地址中有一个地址,那么它只会显示5个客户的送货地址。它将显示所有3个表中的数据,但仅记录该客户的数据在所有表中的位置


也许只在一个表中存储地址是更好的方法。

我不知道联合联接是什么,甚至不知道您是否应该在这里使用联合,但错误是由从联合中的两个表中选择的列的数量/类型不相同引起的。想象一下把两张桌子叠在一起;如果列数或类型数不相同,则联合将不起作用。正如@TimBiegeleisen指出的,由于错误消息中描述的原因,联合将失败。是什么让你认为在进行联接时不能只从每个表中选择一些列?@Blackwood我在网上查看了一下,找不到这样做的方法。。。例如,所有的示例似乎都只允许从表1中选择行,而搜索如何从这两个行中进行选择正是让我想到UNION IDEA的原因您使用的是什么SQL平台?联合绝对是错误的方法。首先让查询在Access中工作,然后切换到SQL视图以检索SQL查询。这是无效的vbOh,我没有关系,这就解释了。这里有很多信息,谢谢!