webForumDet fria alternativet

SQL med IN() blir gör tung?

1 svar · 520 visningar · startad av evilaid

evilaidMedlem sedan apr. 2009433 inlägg
#1

Jag har en frågesats där jag använder IN() men den här frågan blir jäätetung när in() (som är nästlad) ger mer än ett resultat..

Alltså så förenklat så ser min fråga ut så här:

SELECT tbl1.col FROM pd_mounting_details WHERE col = 1 AND col2 IN ((SELECT id FROM (SELECT top 2 MIN(prod_week) as te FROM pd_mounting_details where status=4 group by oe.prodplan_id order by te) AS ta)) ORDER BY prod_week ASC

Den nätslade frågan som hämtar max två rader är den som ställer till det, om resultatet av den endast är en rad så går det jättesmidigt men blir det två rader så tar frågan säkert en minut att köra..

totalt hämtas ca 2800 rader..

Den nästalde frågan går jättesnabbt att köra om den körs separat. Öven den yttre går snabbt om man tar bort den innre nästalde frågan.. Förstår inte varför de inte funkar ihop?

Bästa är nästan att köra den innre frågan helt separat, ta värdena från den och sedan stoppa in i IN() villkoret. Då går det göör smidigt igen?
´
här är hela orginalkoden:
SELECT oe.id AS oeID, oh.ordernumber, oe.order_line, oe.prodplan_id, oe.amount AS amountOfDoors, oe.door_type, oe.inner_color, oe.outer_color, oe.prod_week,i.amount AS iAmount, md.status AS mdStatus, i.width, i.length, c.color_name AS innerColor, c2.color_name AS outerColor, pp.status, oe.pos, md.starttime FROM pd_mounting_details AS md LEFT OUTER JOIN pd_order_eco AS oe ON md.order_data = oe.id LEFT OUTER JOIN pd_article AS a ON md.article = a.id LEFT OUTER JOIN pd_inventory AS i ON md.id = i.pp_id LEFT OUTER JOIN pd_order_head AS oh ON oe.order_head = oh.id LEFT OUTER JOIN pd_colors AS c ON oe.inner_color = c.id LEFT OUTER JOIN pd_colors AS c2 ON oe.outer_color = c2.id LEFT OUTER JOIN pd_production_plan AS pp ON oe.prodplan_id = pp.id WHERE (a.production_group = 1) AND (NOT (oe.amount = 0)) AND (pp.status = 4) and ( md.stoptime ='' or md.stoptime is null) AND (NOT a.name='Al.pr ligg' AND NOT a.name='Al.pr stå') AND oe.prodplan_id IN ((SELECT prodplan_id FROM (SELECT top 2 MIN(oe.prod_week) as te, oe.prodplan_id FROM pd_mounting_details as md LEFT OUTER JOIN pd_order_ecolid AS oe ON md.order_data = oe.id LEFT OUTER JOIN pd_article AS a ON md.article = a.id where oe.status=4 AND (md.stoptime ='' or md.stoptime is null) AND (a.production_group = 1) AND (NOT oe.amount = 0) AND (NOT a.name='Al.pr ligg' AND NOT a.name='Al.pr stå') group by oe.prodplan_id order by te) AS ta)) ORDER BY oe.prod_week ASC, oe.pos

hoppas någon förstår hur jag menar, börjar bli rena greiskan för mig själv nu..

Mvh

aasahMedlem sedan mars 20034 471 inlägg
#2

Använd gärna [_highlight=sql]
SELECT *
FROM
X -- Dvs All SQL kod här [_/highlight] (utan _ i taggarna) och indentera den fullständiga SQL-koden inom dessa taggar så ska jag titta på den igen senare om ingen annan gjort det dessförinnan. Visas som

 
SELECT * 
FROM 
  X -- Dvs All SQL kod här
137 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)