【发布时间】:2017-06-19 14:55:50
【问题描述】:
真的很抱歉,我刚开始研究 SQL 我之前在 SQL 上做了一些工作,但现在只是更新、删除和插入,我确实需要优化以下查询,这需要 7 秒来处理 70 个项目。
一个包含行项目的表格,另一个包含供应商报价的表格以及一个仓库信息表格。
我确实需要显示具有最佳 3 个供应商报价的订单项(报价 1 - 报价 1 名称 - 报价 1 评论)以及仓库信息
能否请您帮我解决一下,并教我一种快速查询的方法。
谢谢,
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)
【问题讨论】:
-
在开始复杂查询之前应该更好地学习正确的sql ..从简单查询开始并加入.....你以错误的方式使用SQL ..
-
能否请您告诉我我的错误在哪里以及如何解决它们。
-
你有几个不正确的使用 sql ..最相关的是 sistematic 使用 subselect 而不是正确的 join ..
-
但我无法使用连接来从表中获取 3 行并将它们显示为我的视图中的列,_APPA_SUPPLIER_OFFER_SECILI_FIYATLI_VIEW 是我的表,其中包含每个项目的供应商报价,我需要获得这些报价作为我的主视图中的列
-
您可以根据您的实际情况制作简化的架构,但使用具有广泛意义的名称,例如 Person.Age 而不是 TBLSTHAR.STOK_KODU 并且只有必要数量的属性。提供表格定义,提供样本数据和预期结果。现在您可以希望得到足够满足您需要的查询。
标签: sql performance optimization sql-server-2012 query-optimization