0

Es tut mir wirklich leid, aber gerade begann mit SQL zu arbeiten Ich habe einige Arbeit an SQL vor, aber nur Updates, löscht und fügt jetzt muss ich die folgende Abfrage optimieren, die 7 Sekunden dauert für 70 Artikel.Optimierung der SQL-Abfrage, die innere Abfrage hat

Eine Tabelle mit Werbebuchungen und eine weitere Tabelle mit Lieferantenangeboten sowie eine Tabelle mit Lagerinformationen.

Ich brauche Positionen zu zeigen, mit besten 3 Anbieter bieten (Angebot 1- Angebot 1 Name - Angebot 1 Kommentar) und auch Lager Informationen

Könnten Sie mir bitte darüber helfen, und lehre mich, einen Weg zu machen meine Abfragen schnell.

Danke,

declare @usd nvarchar(10) 
declare @gbp nvarchar(10) 
declare @euro nvarchar(10) 

set @usd=(select top 1 KUR from _APPA_WEB_KUR WHERE CURRENCY = 'USD' ORDER BY INCKEYNO DESC) 
set @gbp=(select top 1 KUR from _APPA_WEB_KUR WHERE CURRENCY = 'GBP' ORDER BY INCKEYNO DESC) 
set @euro=(select top 1 KUR from _APPA_WEB_KUR WHERE CURRENCY = 'EURO' ORDER BY INCKEYNO DESC) 

SELECT 
    item.INCKEYNO, COMMENT, item.SIRA, item.[FILE_NUMBER], [REFERANCE_NO], 
    [GROUP_ID], [IMPA_CODE], [DESCRIPTION], [UNIT], [QTTY], 
    item.[CREATED_BY], item.[DATE], removed, 
    (SELECT TOP 1 (isnull 
    ((SELECT cast(sum(STHAR_GCMIK) AS int)FROM TBLSTHAR 
    WHERE STHAR_GCKOD = 'G' AND TBLSTHAR.STOK_KODU LIKE ('%' + item.IMPA_CODE + '%') AND sthar_htur != 'L' AND SUBE_KODU = '4'), 0) - isnull 
    ((SELECT cast(sum(STHAR_GCMIK) AS int) 
    FROM TBLSTHAR 
    WHERE STHAR_GCKOD = 'C' AND TBLSTHAR.STOK_KODU LIKE ('%' + item.IMPA_CODE + '%') AND sthar_htur != 'L' AND SUBE_KODU = '4'), 0)) AS bakiye 
    FROM TBLSTHAR) AS depo4, 
     (SELECT TOP 1 (isnull 
    ((SELECT cast(sum(STHAR_GCMIK) AS int) 
FROM TBLSTHAR WHERE STHAR_GCKOD = 'G' AND TBLSTHAR.STOK_KODU LIKE ('%' + item.IMPA_CODE + '%') AND sthar_htur != 'L' AND SUBE_KODU = '2'), 0) 
           - isnull ((SELECT cast(sum(STHAR_GCMIK) AS int) FROM TBLSTHAR WHERE STHAR_GCKOD = 'C' AND 
           TBLSTHAR.STOK_KODU LIKE ('%' + item.IMPA_CODE + '%') AND sthar_htur != 'L' AND SUBE_KODU = '2'), 0)) AS bakiye 
    FROM TBLSTHAR) AS depo2, 
     (SELECT TOP 1 ([SECILI_FIYAT]) 
    FROM [dbo].[_APPA_SUPPLIER_OFFER_SECILI_FIYATLI_VIEW] 
    WHERE FILE_NUMBER = item.file_number AND IMPA_CODE = item.IMPA_CODE AND PRICE IS NOT NULL AND REFERANCE_NO = item.REFERANCE_NO 
    ORDER BY CAST(isnull(SECILI_FIYAT, 0) AS DECIMAL(18, 2)) ASC) AS OFFER1, 
     (SELECT TOP 1 SUPPLIER_ID 
    FROM [dbo].[_APPA_SUPPLIER_OFFER_SECILI_FIYATLI_VIEW] 
    WHERE FILE_NUMBER = item.file_number AND IMPA_CODE = item.IMPA_CODE AND PRICE IS NOT NULL AND REFERANCE_NO = item.REFERANCE_NO 
    ORDER BY CAST(isnull(SECILI_FIYAT, 0) AS DECIMAL(18, 2)) ASC) AS order1_supplier, 
     (SELECT TOP 1 COMMENT 
    FROM [dbo].[_APPA_SUPPLIER_OFFER_SECILI_FIYATLI_VIEW] 
    WHERE FILE_NUMBER = item.file_number AND IMPA_CODE = item.IMPA_CODE AND PRICE IS NOT NULL AND REFERANCE_NO = item.REFERANCE_NO 
    ORDER BY CAST(isnull(SECILI_FIYAT, 0) AS DECIMAL(18, 2)) ASC) AS order1_comment, 
     (SELECT dbo.trk(cari_isim) 
    FROM TBLCASABIT 
    WHERE CARI_KOD = (SELECT SUPPLIER_ID 
    FROM (SELECT SUPPLIER_ID, PRICE, ROW_NUMBER() OVER (ORDER BY CAST(isnull(SECILI_FIYAT, 0) AS DECIMAL(18, 2)) ASC) AS Salary_Order 
    FROM [dbo].[_APPA_SUPPLIER_OFFER_SECILI_FIYATLI_VIEW] 
    WHERE FILE_NUMBER = item.file_number AND IMPA_CODE = item.IMPA_CODE AND PRICE IS NOT NULL AND REFERANCE_NO = item.REFERANCE_NO) DT 
    WHERE DT.Salary_Order = 1)) AS offer1cari, 
    (SELECT [SECILI_FIYAT] 
FROM (SELECT SECILI_FIYAT, ROW_NUMBER() OVER (ORDER BY CAST(isnull(SECILI_FIYAT, 0) AS DECIMAL(18, 2)) ASC) AS Salary_Order 
FROM [dbo].[_APPA_SUPPLIER_OFFER_SECILI_FIYATLI_VIEW] 
WHERE FILE_NUMBER = item.file_number AND IMPA_CODE = item.IMPA_CODE AND PRICE IS NOT NULL AND REFERANCE_NO = item.REFERANCE_NO) DT 
WHERE DT.Salary_Order = 2) AS OFFER2, 
    (SELECT SUPPLIER_ID 
FROM (SELECT SUPPLIER_ID, SECILI_FIYAT, ROW_NUMBER() OVER (ORDER BY CAST(isnull(SECILI_FIYAT, 0) AS DECIMAL(18, 2)) ASC) AS Salary_Order 
FROM [dbo].[_APPA_SUPPLIER_OFFER_SECILI_FIYATLI_VIEW] 
WHERE FILE_NUMBER = item.file_number AND IMPA_CODE = item.IMPA_CODE AND PRICE IS NOT NULL AND REFERANCE_NO = item.REFERANCE_NO) DT 
WHERE DT.Salary_Order = 2) AS order2_supplier, 
    (SELECT dbo.trk(cari_isim) 
FROM TBLCASABIT 
WHERE CARI_KOD =(SELECT SUPPLIER_ID 
     FROM (SELECT SUPPLIER_ID, PRICE, ROW_NUMBER() OVER (ORDER BY CAST(isnull(SECILI_FIYAT, 0) AS DECIMAL(18, 2)) ASC) AS Salary_Order 
     FROM [dbo].[_APPA_SUPPLIER_OFFER_SECILI_FIYATLI_VIEW] 
     WHERE FILE_NUMBER = item.file_number AND IMPA_CODE = item.IMPA_CODE AND PRICE IS NOT NULL AND REFERANCE_NO = item.REFERANCE_NO) DT 
WHERE DT.Salary_Order = 2)) AS offer2cari, 
    (SELECT COMMENT 
FROM (SELECT COMMENT, ROW_NUMBER() OVER (ORDER BY CAST(isnull(SECILI_FIYAT, 0) AS DECIMAL(18, 2)) ASC) AS Salary_Order 
FROM [dbo].[_APPA_SUPPLIER_OFFER_SECILI_FIYATLI_VIEW] 
WHERE FILE_NUMBER = item.file_number AND IMPA_CODE = item.IMPA_CODE AND PRICE IS NOT NULL AND REFERANCE_NO = item.REFERANCE_NO) DT 
WHERE DT.Salary_Order = 2) AS order2_comment, 
    (SELECT [SECILI_FIYAT] 
FROM (SELECT [SECILI_FIYAT], vat, ROW_NUMBER() OVER (ORDER BY CAST(isnull(SECILI_FIYAT, 0) AS DECIMAL(18, 2)) ASC) AS Salary_Order 
FROM [dbo].[_APPA_SUPPLIER_OFFER_SECILI_FIYATLI_VIEW] 
WHERE FILE_NUMBER = item.file_number AND IMPA_CODE = item.IMPA_CODE AND PRICE IS NOT NULL AND REFERANCE_NO = item.REFERANCE_NO) DT 
WHERE DT.Salary_Order = 3) AS OFFER3, 
    (SELECT SUPPLIER_ID 
FROM (SELECT SUPPLIER_ID, SECILI_FIYAT, ROW_NUMBER() OVER (ORDER BY CAST(isnull(SECILI_FIYAT, 0) AS DECIMAL(18, 2)) ASC) AS Salary_Order 
FROM [dbo].[_APPA_SUPPLIER_OFFER_SECILI_FIYATLI_VIEW] 
WHERE FILE_NUMBER = item.file_number AND IMPA_CODE = item.IMPA_CODE AND PRICE IS NOT NULL AND REFERANCE_NO = item.REFERANCE_NO) DT 
WHERE DT.Salary_Order = 3) AS order3_supplier, 
    (SELECT dbo.trk(cari_isim) 
FROM TBLCASABIT 
WHERE CARI_KOD =(SELECT SUPPLIER_ID 
     FROM (SELECT SUPPLIER_ID, SECILI_FIYAT, ROW_NUMBER() OVER (ORDER BY CAST(isnull(SECILI_FIYAT, 0) AS DECIMAL(18, 2)) ASC) AS Salary_Order 
     FROM [dbo].[_APPA_SUPPLIER_OFFER_SECILI_FIYATLI_VIEW] 
     WHERE FILE_NUMBER = item.file_number AND IMPA_CODE = item.IMPA_CODE AND PRICE IS NOT NULL AND REFERANCE_NO = item.REFERANCE_NO) DT 
WHERE DT.Salary_Order = 3)) AS offer3cari, 
    (SELECT COMMENT 
FROM (SELECT COMMENT, ROW_NUMBER() OVER (ORDER BY CAST(isnull(SECILI_FIYAT, 0) AS DECIMAL(18, 2)) ASC) AS Salary_Order 
FROM [dbo].[_APPA_SUPPLIER_OFFER_SECILI_FIYATLI_VIEW] 
WHERE FILE_NUMBER = item.file_number AND IMPA_CODE = item.IMPA_CODE AND PRICE IS NOT NULL AND REFERANCE_NO = item.REFERANCE_NO) DT 
WHERE DT.Salary_Order = 3) AS order3_comment, @euro AS EURO, @gbp AS GBP, @usd AS USD, mas.CURRENCY, 
'0' depo4_fiyat,'0' depo2_fiyat, item.price, item.supplier 
FROM [dbo].[_APPA_WEB_PURCHASE_OFFER_LINE_ITEMS_2] item LEFT OUTER JOIN 
    dbo._APPA_WEB_PURCHASE_OFFER_MASTER AS mas ON mas.FILE_NUMBER = item.FILE_NUMBER 
WHERE (item.removed != 1 OR 
    item.removed IS NULL) 
+1

vor mit komplexer Abfrage starten sollte besser lernen, richtig SQL ..starting mit einfacher Abfrage und kommen ..... Sie sind in falschem Weg SQL verwenden .. – scaisEdge

+0

könnten Sie mir bitte zeigen Wo sind meine Fehler und wie könnte ich sie beheben? – burc

+0

Sie haben mehrere unsachgemäße Verwendung von SQL .. die relevanteste ist eine systematische Verwendung von Subselect anstelle der richtigen Join .. – scaisEdge

Antwort

0

Der Code ist ziemlich schwierig. Ich habe mein Bestes getan, um genau zu refaktorieren, aber ich habe keine Möglichkeit, das zu überprüfen. Also hier ist es:

;WITH line_items AS (
     -- Read all the lines that we will need 

     SELECT * 
     FROM [dbo].[_APPA_WEB_PURCHASE_OFFER_LINE_ITEMS_2] item 
     WHERE COALESCE(item.removed,0) != 1 

), 
suppliers AS (
     -- Get a ranked list of supplier, offers and comments 

     SELECT v.COMMENT, 
      v.SUPPLIER_ID, 
      v.[SECILI_FIYAT], 
      ROW_NUMBER() OVER(ORDER BY CAST(isnull(v.SECILI_FIYAT, 0) AS DECIMAL(18, 2)) ASC) AS Salary_Order, 
      v.FILE_NUMBER, 
      v.IMPA_CODE, 
      v.REFERANCE_NO, 
      dbo.trk(b.cari_isim) AS cari 
     FROM [dbo].[_APPA_SUPPLIER_OFFER_SECILI_FIYATLI_VIEW] v 
      INNER JOIN line_items item 
      ON v.FILE_NUMBER = item.file_number 
       AND v.IMPA_CODE = item.IMPA_CODE 
       AND v.REFERANCE_NO = item.REFERANCE_NO 
      INNER JOIN TBLCASABIT b 
      ON b.CARI_KOD = v.SUPPLIER_ID 
     WHERE v.PRICE IS NOT NULL 
), 
t_STHAR AS (
     SELECT  
      CAST( ISNULL(SUM(CASE WHEN st.SUBE_KODU = '2' AND st.STHAR_GCKOD = 'G' THEN st.STHAR_GCMIK ELSE 0 END),0) - 
        ISNULL(SUM(CASE WHEN st.SUBE_KODU = '2' AND st.STHAR_GCKOD = 'C' THEN st.STHAR_GCMIK ELSE 0 END),0) AS INT) AS depo2, 

      CAST( ISNULL(SUM(CASE WHEN st.SUBE_KODU = '4' AND st.STHAR_GCKOD = 'G' THEN st.STHAR_GCMIK ELSE 0 END),0) - 
        ISNULL(SUM(CASE WHEN st.SUBE_KODU = '4' AND st.STHAR_GCKOD = 'C' THEN st.STHAR_GCMIK ELSE 0 END),0) AS INT) AS depo4 
     FROM TBLSTHAR 
     WHERE STHAR_HTUR != 'L' 
     AND EXISTS (
      SELECT 1 
      FROM line_items 
      WHERE STOK_KODU LIKE('%'+item.IMPA_CODE+'%') 
     ) 
) 

SELECT item.INCKEYNO, 
     COMMENT, 
     item.SIRA, 
     item.[FILE_NUMBER], 
     [REFERANCE_NO], 
     [GROUP_ID], 
     [IMPA_CODE], 
     [DESCRIPTION], 
     [UNIT], 
     [QTTY], 
     item.[CREATED_BY], 
     item.[DATE], 
     removed, 

     st.depo2, 
     st.depo4, 

     -- Use (JOIN, MAX, GROUP BY) method to transpose rows to columns 
     MAX(CASE WHEN s.Salary_Order = 1 THEN s.[SECILI_FIYAT] END) AS OFFER1, 
     MAX(CASE WHEN s.Salary_Order = 1 THEN s.SUPPLIER_ID END) AS order1_supplier, 
     MAX(CASE WHEN s.Salary_Order = 1 THEN s.cari END) AS offer1cari, 
     MAX(CASE WHEN s.Salary_Order = 1 THEN s.COMMENT END) AS order1_comment, 

     MAX(CASE WHEN s.Salary_Order = 2 THEN s.[SECILI_FIYAT] END) AS OFFER1, 
     MAX(CASE WHEN s.Salary_Order = 2 THEN s.SUPPLIER_ID END) AS order2_supplier, 
     MAX(CASE WHEN s.Salary_Order = 2 THEN s.cari END) AS offer2cari, 
     MAX(CASE WHEN s.Salary_Order = 2 THEN s.COMMENT END) AS order2_comment, 

     MAX(CASE WHEN s.Salary_Order = 3 THEN s.[SECILI_FIYAT] END) AS OFFER3, 
     MAX(CASE WHEN s.Salary_Order = 3 THEN s.SUPPLIER_ID END) AS order3_supplier, 
     MAX(CASE WHEN s.Salary_Order = 3 THEN s.cari END) AS offer3cari, --- 
     MAX(CASE WHEN s.Salary_Order = 3 THEN s.COMMENT END) AS order3_comment, 

     @euro AS EURO, 
     @gbp AS GBP, 
     @usd AS USD, 
     mas.CURRENCY, 
     '0' depo4_fiyat, 
     '0' depo2_fiyat, 
     item.price, 
     item.supplier 
FROM line_items item 
    LEFT OUTER JOIN dbo._APPA_WEB_PURCHASE_OFFER_MASTER mas 
     ON mas.FILE_NUMBER = item.FILE_NUMBER 
    LEFT JOIN suppliers s 
     ON item.FILE_NUMBER = s.FILE_NUMBER 
     AND item.IMPA_CODE = s.IMPA_CODE 
     AND item.REFERANCE_NO = s.REFERANCE_NO 
    CROSS APPLY t_STHAR st 
GROUP BY item.INCKEYNO, 
     COMMENT, 
     item.SIRA, 
     item.[FILE_NUMBER], 
     [REFERANCE_NO], 
     [GROUP_ID], 
     [IMPA_CODE], 
     [DESCRIPTION], 
     [UNIT], 
     [QTTY], 
     item.[CREATED_BY], 
     item.[DATE], 
     removed, 
     st.depo2, 
     st.depo4, 
     mas.CURRENCY, 
     item.price, 
     item.supplier 
; 
0

ich eine Tabelle zu tun haben, die Lieferanten

SUPPLIER_ID bieten umfasst, File_Nr, referance_no, ITEM_ID,

Kommentar und ich habe einen Master-Tabelle welches Werbebuchungsinformationen enthält;

item_id, File_Nr, referance_no ... etc

i diese brauchen besten 3 Anbieter bieten (um nach Preis) und Lieferanteninformationen SUPPLIER_ID, Preis, Kommentar zu bekommen und ich brauche hinzufügen 9 Zellen zu meiner Master-Tabelle

ich möchte meine Ansicht wie sehen; zu lesen

item_id, file_no, referance_no ...+ 
offer1_price, offer1_comment, offer1_supplier_id, 
offer2_price, offer2_comment, offer2_supplier_id, 
offer3_price, offer3_comment, offer3_supplier_id, 

Tasten sind item_id, File_Nr und referance_no