Avatar billede rohde Nybegynder
02. oktober 2005 - 16:02 Der er 12 kommentarer og
2 løsninger

Data fra første forespørgsel skal anvendes i anden forespørgsel

MS SQL 2000

Senario:
Jeg har en forespørgsel 1 der returner en bunke data. Dette data skal jeg anvende i forespørgsel 2.

Spørgsmål:
Bliver jeg nød til at skrive det data fra 1. forspørgsel ned i en tabel for kunne anvende det i forspørgsel 2.

Jeg er ingen haj til SQL så svaret er måske meget enkelt.
Avatar billede medions Nybegynder
02. oktober 2005 - 16:10 #1
Prøv og søg efter emnet Subselects!

fx.

SELECT * FROM tblTabel1 WHERE kolonne1 = (SELECT * FROM tblTabel2 WHERE ID = '1')

osv. :)

Du kan også prøve og kigge på JOIN clausen, denne kan også gøre meget ;-)


//>Rune
Avatar billede arne_v Ekspert
02. oktober 2005 - 16:29 #2
rohde>

prøv at forklare lidt nærmere hvad du vil

medions>

sådan en subselect skal kun returnere en kolonne (og med = fremfor IN så
skal den også kun returnere en række)
Avatar billede rohde Nybegynder
02. oktober 2005 - 16:34 #3
Tak for det, jeg roder videre, men jeg tror du har vist mig i den rigtige retning. Vender tilbage.
Avatar billede rohde Nybegynder
02. oktober 2005 - 16:55 #4
Hej arne v
Jeg har en database som er fastlagt fra producenten. Jeg har en masse måle data fra forskellige PC'er. Dette måle data er vedhæftet diverse kommentarer som ligger i en tabel. Min første forespørgsel henter rådata og et kommentar-ID. Udfra kommentar-ID skal jeg hente en specifik kommentar til de fundne rådata/kommentar-ID. Går udfra at jeg kan anvende Subselect.
Avatar billede kjulius Novice
02. oktober 2005 - 17:01 #5
Hvis jeg forstår dit spørgsmål rigtigt, så ønsker du at bruge en midlertidig forespørgsel, hvis resultatsæt du vil arbejde videre med. Det kan gøres rimeligt enkelt på formlen:

SELECT felter FROM (din første forespørgsel) AS et navn WHERE osv.

Eksempel:

Du har en forespørgsel 1:

SELECT felt1, sum(felt2) as sum2, avg(felt3) as avg3 FROM dinTabel WHERE felt4 = 123 GROUP BY felt1

Data fra denne forespørgsel vil du arbejde videre med:

SELECT felt1, sum2, avg3, count(*) as antal
FROM (SELECT felt1, sum(felt2) as sum2, avg(felt3) as avg3 FROM dinTabel WHERE felt4 = 123 GROUP BY felt1) as t1
HAVING count(*) > 1
ORDER BY sum2

Det virker fint, eneste begrænsning er, at data i temp forespørgslen ikke kan bruge en ORDER BY.
Avatar billede kjulius Novice
02. oktober 2005 - 17:06 #6
Og, som det efterhånden er sædvane, glemmer jeg noget. Den pokkers mus klikker altid på send for tidligt! :-)

Selv om den viste SQL bare er for at vise princippet, skal den naturligvis i princippet kunne køre - og det kan den ikke uden en ydre GROUP BY, så derfor denne korektion:

SELECT felt1, sum2, avg3, count(*) as antal
FROM (SELECT felt1, sum(felt2) as sum2, avg(felt3) as avg3 FROM dinTabel WHERE felt4 = 123 GROUP BY felt1) as t1
GROUP BY felt1
HAVING count(*) > 1
ORDER BY sum2
Avatar billede arne_v Ekspert
02. oktober 2005 - 17:15 #7
jeg vil tro at du bare skal have en JOIN:

SELECT * FROM rådatatabel,kommentartabel WHERE rådatatabel.kommentarid=kommentartabel.id
Avatar billede kjulius Novice
02. oktober 2005 - 17:37 #8
Du kunne måske også bruge et format som:

SELECT * FROM (din første forespørgsel) as t1 LEFT JOIN kommentartabel on t1.kommentarid = kommentartabel.id
Avatar billede rohde Nybegynder
02. oktober 2005 - 17:58 #9
Jeg takker for de fine svar og vender tilbage med svar. :-)
Avatar billede rohde Nybegynder
02. oktober 2005 - 19:43 #10
Mit måle data er vedhæftet Tracedata såsom Lotnummer og dato alt trace data ligger i en tabel kaldt Trace i CategoryValue. Så først finder jeg min rådata ud fra lotnummer,station,part,char.
Når dette er funden skal jeg have vedhæftet en dato til rådata som ligger i tabellen Trace.

Min forespørgsel1 Henter rådata:
SELECT DISTINCT PartData.PartName, CharData.CharacteristicName AS GroupBy, PrintOrder, SubgroupData.SubgroupID, SubgroupDateTime, SampleData.SubgroupIx, SampleData.Excluded, SampleData.Sample, CharData.DataType, CharData.DefaultChart, CharData.SubgroupSize, CharData.PartCharID, CharData.DecimalPlaces, CharData.Target, CharData.Usl, CharData.Lsl, CharData.Uwl, CharData.Lwl,  CharData.Url, CharData.Lrl,  CharData.CapabilityType, CharData.LimitMethod, CharData.DistributionType, CharData.ScaleValueOnInput, SubgroupData.AlarmChar, Trace0.TraceID, Trace0.CategoryValue AS [Lotnr], Events.EventID, Events.CategoryName As EventName, Events.CategoryValue As EventValue, SampleData.SampleSize, SampleData.TotalDefects, Defects.DefectID, Defects.DefectCategory, Defects.DefectName, Defects.DefectCount, LimitData.LimitsID, LimitData.LCLX, LimitData.CLX, LimitData.UCLX, LimitData.LCLR, LimitData.CLR, LimitData.UCLR, LimitData.LCLS, LimitData.CLS, LimitData.UCLS, LimitData.LCLE, LimitData.UCLE, Stations.StationID, Stations.StationName 
FROM  Trace as Trace0  INNER JOIN (Events RIGHT JOIN (  Defects RIGHT JOIN ((PartData  INNER JOIN ((((SubgroupData INNER JOIN CharData ON SubgroupData.PartCharID = CharData.PartCharID)  INNER JOIN SampleData ON SubgroupData.SubgroupID = SampleData.SubgroupID)  INNER JOIN LimitData ON SubgroupData.LimitsID = LimitData.LimitsID)  INNER JOIN Stations ON SubgroupData.StationID = Stations.StationID)  ON PartData.PartID = CharData.PartID) ) ON SampleData.DefectID = Defects.DefectID ) ON Events.EventID = SampleData.EventID ) ON Trace0.TraceID = SampleData.TraceID
WHERE PartData.TemplatePart = 0 AND PartData.IsObsolete = 0 AND (Trace0.CategoryName = 'Lotnr') AND (Trace0.CategoryValue = {CategoryValue?}) AND  (Stations.StationName = {StationName?}) AND ( (PartName = {PartName?} AND CharData.CharacteristicName =  {CharacteristicName?})) ORDER BY PartName, PrintOrder, CharData.PartCharID,  SubgroupData.SubgroupID, SubgroupIx, Defects.DefectCategory, Defects.DefectName;

Jeg har ikke selv stykket forespørsel 1 sammen men den retuner det rigtige rådata samt TraceID.

Forsøg på forespørgsel:

Jeg har fjernet ORDER by i denne forespørgsel samt lavet en sub select. Det virker ikke men går ud fra det er noget i den retning. Jeg vil jo gerne have retuneret rådata samt Tracedata.


SELECT Trace.CategoryValue FROM Trace WHERE Trace.TraceID = (SELECT DISTINCT PartData.PartName, CharData.CharacteristicName AS GroupBy, PrintOrder, SubgroupData.SubgroupID, SubgroupDateTime, SampleData.SubgroupIx, SampleData.Excluded, SampleData.Sample, CharData.DataType, CharData.DefaultChart, CharData.SubgroupSize, CharData.PartCharID, CharData.DecimalPlaces, CharData.Target, CharData.Usl, CharData.Lsl, CharData.Uwl, CharData.Lwl,  CharData.Url, CharData.Lrl,  CharData.CapabilityType, CharData.LimitMethod, CharData.DistributionType, CharData.ScaleValueOnInput, SubgroupData.AlarmChar, Trace0.TraceID, Trace0.CategoryValue AS [Lotnr], Events.EventID, Events.CategoryName As EventName, Events.CategoryValue As EventValue, SampleData.SampleSize, SampleData.TotalDefects, Defects.DefectID, Defects.DefectCategory, Defects.DefectName, Defects.DefectCount, LimitData.LimitsID, LimitData.LCLX, LimitData.CLX, LimitData.UCLX, LimitData.LCLR, LimitData.CLR, LimitData.UCLR, LimitData.LCLS, LimitData.CLS, LimitData.UCLS, LimitData.LCLE, LimitData.UCLE, Stations.StationID, Stations.StationName    FROM  Trace as Trace0 INNER JOIN (Events RIGHT JOIN (  Defects RIGHT JOIN ((PartData  INNER JOIN ((((SubgroupData INNER JOIN CharData ON SubgroupData.PartCharID = CharData.PartCharID)  INNER JOIN SampleData ON SubgroupData.SubgroupID = SampleData.SubgroupID)  INNER JOIN LimitData ON SubgroupData.LimitsID = LimitData.LimitsID)  INNER JOIN Stations ON SubgroupData.StationID = Stations.StationID)  ON PartData.PartID = CharData.PartID) ) ON SampleData.DefectID = Defects.DefectID ) ON Events.EventID = SampleData.EventID ) ON Trace0.TraceID = SampleData.TraceID  WHERE PartData.TemplatePart = 0 AND PartData.IsObsolete = 0 AND (Trace0.CategoryName = 'Lotnr') AND (Trace0.CategoryValue = {CategoryValue?}) AND  (Stations.StationName = {StationName?}) AND ( (PartName = {PartName?} AND CharData.CharacteristicName =  {CharacteristicName?})) )
Håber det er til at fatte.
Avatar billede kjulius Novice
02. oktober 2005 - 20:57 #11
Du burde kunne føje din tabel Trace på den oprindelige SQL, men for at sige det som det er, så mistede jeg hurtigt overblikket over den (der er mange tabeller, som knyttes sammen med både INNER JOINs, RIGHT OUTER JOINs. Så hvor skal den hæftes på.

Selv om det måske ikke er god latin, vil jeg alligevel foreslå, at du forsøger dig med:

SELECT Trace.CategoryValue, T1.* FROM (SELECT DISTINCT PartData.PartName, CharData.CharacteristicName AS GroupBy, PrintOrder, SubgroupData.SubgroupID, SubgroupDateTime, SampleData.SubgroupIx, SampleData.Excluded, SampleData.Sample, CharData.DataType, CharData.DefaultChart, CharData.SubgroupSize, CharData.PartCharID, CharData.DecimalPlaces, CharData.Target, CharData.Usl, CharData.Lsl, CharData.Uwl, CharData.Lwl,  CharData.Url, CharData.Lrl,  CharData.CapabilityType, CharData.LimitMethod, CharData.DistributionType, CharData.ScaleValueOnInput, SubgroupData.AlarmChar, Trace0.TraceID, Trace0.CategoryValue AS [Lotnr], Events.EventID, Events.CategoryName As EventName, Events.CategoryValue As EventValue, SampleData.SampleSize, SampleData.TotalDefects, Defects.DefectID, Defects.DefectCategory, Defects.DefectName, Defects.DefectCount, LimitData.LimitsID, LimitData.LCLX, LimitData.CLX, LimitData.UCLX, LimitData.LCLR, LimitData.CLR, LimitData.UCLR, LimitData.LCLS, LimitData.CLS, LimitData.UCLS, LimitData.LCLE, LimitData.UCLE, Stations.StationID, Stations.StationName 
FROM  Trace as Trace0  INNER JOIN (Events RIGHT JOIN (  Defects RIGHT JOIN ((PartData  INNER JOIN ((((SubgroupData INNER JOIN CharData ON SubgroupData.PartCharID = CharData.PartCharID)  INNER JOIN SampleData ON SubgroupData.SubgroupID = SampleData.SubgroupID)  INNER JOIN LimitData ON SubgroupData.LimitsID = LimitData.LimitsID)  INNER JOIN Stations ON SubgroupData.StationID = Stations.StationID)  ON PartData.PartID = CharData.PartID) ) ON SampleData.DefectID = Defects.DefectID ) ON Events.EventID = SampleData.EventID ) ON Trace0.TraceID = SampleData.TraceID
WHERE PartData.TemplatePart = 0 AND PartData.IsObsolete = 0 AND (Trace0.CategoryName = 'Lotnr') AND (Trace0.CategoryValue = {CategoryValue?}) AND  (Stations.StationName = {StationName?}) AND ( (PartName = {PartName?} AND CharData.CharacteristicName =  {CharacteristicName?})) ORDER BY PartName, PrintOrder, CharData.PartCharID,  SubgroupData.SubgroupID, SubgroupIx, Defects.DefectCategory, Defects.DefectName) as t1 LEFT JOIN Trace on t1.TraceID = Trace.id;
Avatar billede rohde Nybegynder
02. oktober 2005 - 21:10 #12
Hej  kjulius
:-) ja jeg har også lidt svært ved at følge med. Men tak for dit forsøg. Jeg prøver mig lidt frem. Kan du sende et svar så jeg kan sende dig lidt point's.
Avatar billede kjulius Novice
02. oktober 2005 - 21:15 #13
Jo, det er da slet intet problem :-)
Avatar billede rohde Nybegynder
02. oktober 2005 - 21:25 #14
Tak for jeres svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester