Benutzer mit den meisten Antworten
SQL Abfragen verbinden

Frage
-
Hallo Ihr Wissenden.
Habe hier zwei Abfragen, die ich gern verbinden möchte. Die erste Abfrage liefert mir Stammdaten von einem bestimmten Artikel.
select i.ItemCode, i.ItemName, i.FrgnName, i.U_article_no, i.U_old_sap_no, v.ItmsGrpNam as ItmsGrpCod, w.Descr as U_Item_Group2, a.Descr as U_Item_Sales, i.U_u_HS_code_cn, i.CodeBars, i.U_Drawing_Index_n, i.U_Item_Material, i.U_Material_Code, i.U_Item_Standard, i.BWeight1, b.Descr as U_Item_TRACEABLE, c.Descr as U_Item_qa, d.Descr as U_Item_Trading, f.Descr as U_Item_Directive, e.Descr as U_Item_Certificate, i.UserText, i.OnHand, i.OnOrder, i.IsCommited, i.CardCode, u.CardName, u.CardFName, i.LastPurPrc, i.LastPurCur, i.LstEvlPric, i.U_Item_Per from OITM i left join OCRD u on i.CardCode = u.CardCode left join OITB v on i.ItmsGrpCod = v.ItmsGrpCod left join UFD1 w on i.U_Item_Group2 = w.FldValue and w.TableID = 'OITM' and w.FieldID = '0' left join UFD1 a on i.U_Item_Sales = a.FldValue and a.TableID = 'OITM' and a.FieldID = '15' left join UFD1 b on i.U_Item_Traceable = b.FldValue and b.TableID = 'OITM' and b.FieldID = '8' left join UFD1 c on i.U_Item_qa = c.FldValue and c.TableID = 'OITM' and c.FieldID = '12' left join UFD1 d on i.U_Item_Trading = d.FldValue and d.TableID = 'OITM' and d.FieldID = '13' left join UFD1 e on i.U_Item_Certificate = e.FldValue and e.TableID = 'OITM' and e.FieldID = '9' left join UFD1 f on i.U_Item_Directive = f.FldValue and f.TableID = 'OITM' and f.FieldID = '7' where i.ItemCode = 'P0001212'
Die zweite Abfrage liefert zeigt mir Infos aus der letzten Bestellung des Artikels.
select top 1 T1.DocEntry, T1.Quantity, T1.Price, T1.Currency, T1.DocDate, T1.BaseCard as SupplierNumber, T2.CardName as SupplierName, T2.CardFName as SupplierForeignName from POR1 T1 left join OCRD T2 on T2.CardCode = T1.BaseCard where T1.ItemCode = 'P0001212' and T1.LineStatus = 'C' and T1.Price > '0' order by T1.DocDate DESC
Jetzt würde ich gern beide Abfragen zusammen in einer haben, damit zu den Stammdaten die Info über die letzte Bestellung hinten dran gehängt wird. Ich bekomm das nicht hin.
Antworten
-
Hi,
so ganz allgemein würde ich sagen, dein Datenbankdesign ist suboptimal. Anders kann ich mir die 8 Joins auf ein und dieselbe Tabelle nicht erklären. Was machst Du da?
Oder ist UFD1 eine Funktion, ...?
Wie man zwei Abfragen miteinander verbindet, weißt Du doch? Wie hättest Du sonst die vielen JOINs erstellt?
Bevor ich mich daran machen würde, die beiden Abfragen zu verbinden, würde ich die erste Abfrage erstmal einer kritischen Überprüfung unterziehen und schauen, ob das das so wirklich sinnvoll und notwendig ist.
Danach könntest Du bspw. folgendes machen:
WITH Query1 AS ( SELECT ... FROM ... ... ), Query2 AS ( SELECT ... FROM ... ... ) SELECT ... FROM Query1 q1 INNER JOIN Query2 q2 ON q1.ID = q2.ID ...
Zur WITH Klausel und CTEs siehe:
http://msdn.microsoft.com/en-us/library/ms175972.aspx
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert ToBo-fkb Mittwoch, 6. Februar 2013 12:11
Alle Antworten
-
Hi,
so ganz allgemein würde ich sagen, dein Datenbankdesign ist suboptimal. Anders kann ich mir die 8 Joins auf ein und dieselbe Tabelle nicht erklären. Was machst Du da?
Oder ist UFD1 eine Funktion, ...?
Wie man zwei Abfragen miteinander verbindet, weißt Du doch? Wie hättest Du sonst die vielen JOINs erstellt?
Bevor ich mich daran machen würde, die beiden Abfragen zu verbinden, würde ich die erste Abfrage erstmal einer kritischen Überprüfung unterziehen und schauen, ob das das so wirklich sinnvoll und notwendig ist.
Danach könntest Du bspw. folgendes machen:
WITH Query1 AS ( SELECT ... FROM ... ... ), Query2 AS ( SELECT ... FROM ... ... ) SELECT ... FROM Query1 q1 INNER JOIN Query2 q2 ON q1.ID = q2.ID ...
Zur WITH Klausel und CTEs siehe:
http://msdn.microsoft.com/en-us/library/ms175972.aspx
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert ToBo-fkb Mittwoch, 6. Februar 2013 12:11
-
Hallo Stefan,
für die Struktur der Datenbank / Tabellen kann ich leider nichts. SAP B1. In der OITM stehen die Artikelstammdaten und man kann dort Benutzerdefinierte Spalten anlegen. Dann stehen in der OITM dort nur Codes und Kürzel. Die Auflösung, bzw. die eigentlich nützliche Info steht in der UFD1. Also bleibt mir nichts anderes übrig als die bestimmte Zellenwerte aus der OITM durch die Inhalte der UFD1 zu ersetzen um ein sinnvolle Ergebnisse zu Erlangen, die man auch verstehen kann.
Darüber hinaus bin ich nun nicht der SQL Profi und habe mich mit den Mitteln beholfen, die ich kenne. Habe Dein Beispiel jetzt mal so umgesetzt und es schein zu funktionieren. Ist nur elend lang...
WITH Query1 AS ( select i.ItemCode, i.ItemName, i.FrgnName, i.U_article_no, i.U_old_sap_no, v.ItmsGrpNam as ItmsGrpCod, w.Descr as U_Item_Group2, a.Descr as U_Item_Sales, i.U_u_HS_code_cn, i.CodeBars, i.U_Drawing_Index_n, i.U_Item_Material, i.U_Material_Code, i.U_Item_Standard, i.BWeight1, b.Descr as U_Item_TRACEABLE, c.Descr as U_Item_qa, d.Descr as U_Item_Trading, f.Descr as U_Item_Directive, e.Descr as U_Item_Certificate, i.UserText, i.OnHand, i.OnOrder, i.IsCommited, i.CardCode, u.CardName, u.CardFName, i.LastPurPrc, i.LastPurCur, i.LstEvlPric, i.U_Item_Per from OITM i left join OCRD u on i.CardCode = u.CardCode left join OITB v on i.ItmsGrpCod = v.ItmsGrpCod left join UFD1 w on i.U_Item_Group2 = w.FldValue and w.TableID = 'OITM' and w.FieldID = '0' left join UFD1 a on i.U_Item_Sales = a.FldValue and a.TableID = 'OITM' and a.FieldID = '15' left join UFD1 b on i.U_Item_Traceable = b.FldValue and b.TableID = 'OITM' and b.FieldID = '8' left join UFD1 c on i.U_Item_qa = c.FldValue and c.TableID = 'OITM' and c.FieldID = '12' left join UFD1 d on i.U_Item_Trading = d.FldValue and d.TableID = 'OITM' and d.FieldID = '13' left join UFD1 e on i.U_Item_Certificate = e.FldValue and e.TableID = 'OITM' and e.FieldID = '9' left join UFD1 f on i.U_Item_Directive = f.FldValue and f.TableID = 'OITM' and f.FieldID = '7' where i.ItemCode = 'P0001212' ), Query2 AS ( select top 1 T1.ItemCode, T1.DocEntry, T1.Quantity, T1.Price, T1.Currency, T1.Quantity * Price as Total, T1.DocDate, T1.BaseCard as SupplierNumber, T2.CardName as SupplierName, T2.CardFName as SupplierForeignName from POR1 T1 left join OCRD T2 on T2.CardCode = T1.BaseCard where T1.ItemCode = 'P0001212' and T1.LineStatus = 'C' and T1.Price > '0' order by T1.DocDate DESC ) SELECT q1.ItemCode, q1.ItemName, q1.FrgnName, q1.U_article_no, q1.U_old_sap_no, q1.ItmsGrpCod, q1.U_Item_Group2, q1.U_Item_Sales, q1.U_u_HS_code_cn, q1.CodeBars, q1.U_Drawing_Index_n, q1.U_Item_Material, q1.U_Material_Code, q1.U_Item_Standard, q1.BWeight1, q1.U_Item_TRACEABLE, q1.U_Item_qa, q1.U_Item_Trading, q1.U_Item_Directive, q1.U_Item_Certificate, q1.UserText, q1.OnHand, q1.OnOrder, q1.IsCommited, q1.CardCode, q1.CardName, q1.CardFName, q1.LastPurPrc, q1.LastPurCur, q1.LstEvlPric, q1.U_Item_Per, q2.DocEntry, q2.Quantity, q2.Price, q2.Currency, q2.DocDate, q2.SupplierNumber, q2.SupplierName, q2.SupplierForeignName FROM Query1 q1 INNER JOIN Query2 q2 ON q1.ItemCode = q2.ItemCode
- Bearbeitet ToBo-fkb Mittwoch, 6. Februar 2013 03:27
-
Falls Du Query1 häufiger benötigst, könntest Du das auch als View (ohne WHERE-Bedingung) ablegen. Dann werden Deine SQLs wieder kürzer.
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP
http://www.insidesql.org/blogs/cmu/