none
SQL Abfragen verbinden RRS feed

  • 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.

    Dienstag, 5. Februar 2013 08:12

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
    Dienstag, 5. Februar 2013 09:29
    Moderator

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
    Dienstag, 5. Februar 2013 09:29
    Moderator
  • 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
    Mittwoch, 6. Februar 2013 02:53
  • 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/

    Mittwoch, 6. Februar 2013 07:36