Ich versuche, 2 SELECT
Abfragen auszuführen. Die erste Abfrage wählt alle Daten aus Supplier_Product_Pricing
aus, in denen der ausgewählte Kunde und der ausgewählte Lieferant übereinstimmen. Dies füllt eine DataTable
und zeigt den Lieferanten, Produkt und Preis. Dieser funktioniert gut.SQL WHERE IN IN Abfrage, die Werte zurückgibt, die in der anderen Tabelle sind
Die nächste Abfrage, die ich ausführen möchte, sollte alle Produkte von Product Suppliers
auswählen, wobei der Lieferant dem ausgewählten Lieferanten entspricht, aber in Supplier_Product_Pricing
kein Preis für den ausgewählten Kunden angegeben wurde.
Im Wesentlichen möchte ich Daten aus 2 Tabellen laden, eine Reihe von Datensätzen, wo es einen vereinbarten Preis zwischen dem ausgewählten Kunden und Lieferanten gibt, der dann mit einem zweiten Datensatz verbunden wird, der die verbleibenden Produkte dafür ist Lieferant, ohne einen vereinbarten Preis.
Im Folgenden ist der Code ich verwende, dies zu tun:
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
Aber das Ergebnis davon ist, dass es alle Datensätze mit einem Preis zeigt an der Spitze vereinbart wird, und zeigt dann alle, dass Lieferantenprodukte wieder darunter, unabhängig davon, ob ein Preis vereinbart ist oder nicht. Siehe unten.
Wie Sie sehen können, werden die 4 Zeilen mit einem Produktpreis dann unten wiederholt, jedoch ohne einen Preis.
Warum gibt die Abfrage Zeilen zurück, die sich in beiden Tabellen befinden, obwohl eine Klausel NOT IN
verwendet wird?
EDIT
mit der Prämie zu helfen - Wenn ein Parameter verwendet wird, wie in der ersten Antwort vorgeschlagen, werden keine Ergebnisse überhaupt zurückgegeben.
Bei der Verwendung von 2 verschiedenen Parametern, wie ich es anfangs getan habe, gibt es die gleichen Ergebnisse wie im Bild gezeigt, ob ich 10 benutze oder nicht.
Tabelle [Product Suppliers
] - Speichert alle Produkte, die einem Lieferanten zugewiesen wurden. In dem Beispiel wären alle Produkte, die mit 'JON_B' verbunden sind, hier mit 'JON_B' als Lieferant. Alle Produkte von JON_B sind in der folgenden Abbildung zu sehen.
Tabelle [Supplier_Product_Pricing
]
Wie Sie sehen können, gibt es nur 8 Produkte JON_B verknüpft. Wenn ein Preis zu 4 von ihnen hinzugefügt wird, gibt es dann die 4 mit einem Preis zurück, sowie alles wieder ohne einen Preis.Ich muss nur die, die von Supplier_Product_Pricing
mit einem Preis angezeigt werden, sowie diejenigen ohne einen Preis in Product Suppliers
EDIT 2
aus der Antwort von @Bugs bereitgestellt Im Anschluss an
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
Diese Zeit zeigt es nur die Artikel mit einem Preis, nicht die ohne.
Daten aus den entsprechenden Tabellen:
[Product Suppliers
]
[Supplier_Product_Pricing
]
JA! Das ist es, danke. Ich muss ein paar Änderungen vornehmen, aber das zeigt jetzt, was ich brauche. Danke, dass Sie dabei geblieben sind. – David
@David, kein Problem, froh, dass wir es sortieren konnten. – Bugs