|
| SQL liste fra 2 tabeller Fra : Ukendt |
Dato : 17-10-07 10:52 |
|
Hej,
Jeg har brug for at sammenkæde og liste indholdet af 2 tabeller med SQL
SELECT:
Fra tabellen 'tblIncidentLog' henter jeg foregående måned med:
SQLstmt = "SELECT IncidentNo, DisplayDate, DisplayTime,InitRptBy, OffRptBy,
MonthlyRepType, Status, IncidentReported FROM tblIncidentLog WHERE
DisplayDate > DateAdd('m',-1,Now()) ORDER BY " & x & ""
Fra tabellen 'tblIncidentUpdate' skal jeg derefter hente 'UpdateText,
UpdateBy' fra sidste record 'WHERE IncidentId =" & rs("IncidentNo")' fra
ovenstående søgning.
Kan nogen i gruppen hjælpe med en løsning på at finde sidste record i en
tabellen 'tblIncidentUpdate' hvor 'IncidentId = rs("IncidentNo")' og
eventuelt sammenkæde de 2 søgninger i en SQL sætning?
På forhånd tak
Henning
| |
Christian R. Larsen (18-10-2007)
| Kommentar Fra : Christian R. Larsen |
Dato : 18-10-07 08:01 |
|
"Henning Smed" <henning snabela smeds.dk> wrote in message
news:4715db33$0$2682$d40e179e@nntp06.dk.telia.net...
> Hej,
>
> Jeg har brug for at sammenkæde og liste indholdet af 2 tabeller med SQL
> SELECT:
>
> Fra tabellen 'tblIncidentLog' henter jeg foregående måned med:
>
> SQLstmt = "SELECT IncidentNo, DisplayDate, DisplayTime,InitRptBy,
> OffRptBy, MonthlyRepType, Status, IncidentReported FROM tblIncidentLog
> WHERE DisplayDate > DateAdd('m',-1,Now()) ORDER BY " & x & ""
>
> Fra tabellen 'tblIncidentUpdate' skal jeg derefter hente 'UpdateText,
> UpdateBy' fra sidste record 'WHERE IncidentId =" & rs("IncidentNo")' fra
> ovenstående søgning.
>
> Kan nogen i gruppen hjælpe med en løsning på at finde sidste record i en
> tabellen 'tblIncidentUpdate' hvor 'IncidentId = rs("IncidentNo")' og
> eventuelt sammenkæde de 2 søgninger i en SQL sætning?
Indeholder tblIncidentUpdate et timestamp eller et andet datostempel, som du
kan sortere efter, for at få vist den seneste record først?
I så fald ... ORDER BY <timestamp> LIMIT 1
| |
Ukendt (18-10-2007)
| Kommentar Fra : Ukendt |
Dato : 18-10-07 09:56 |
|
"Christian R. Larsen" <crlarsen@hotmail.com> wrote in message
news:471704a7$0$90270$14726298@news.sunsite.dk...
> "Henning Smed" <henning snabela smeds.dk> wrote in message
> news:4715db33$0$2682$d40e179e@nntp06.dk.telia.net...
>> Hej,
>>
>>
>> Kan nogen i gruppen hjælpe med en løsning på at finde sidste record i en
>> tabellen 'tblIncidentUpdate' hvor 'IncidentId = rs("IncidentNo")' og
>> eventuelt sammenkæde de 2 søgninger i en SQL sætning?
>
> Indeholder tblIncidentUpdate et timestamp eller et andet datostempel, som
> du kan sortere efter, for at få vist den seneste record først?
>
> I så fald ... ORDER BY <timestamp> LIMIT 1
Hej Christian,
Ja jeg har en autonummering så jeg kan finde sidste record med ORDER BY og
LIMIT 1, men jeg har også brug for at kende det antal records der er bundet
til et bestemt 'IncidentId' fra den første tabel, det kan klares med SELECT
COUNT(Id) AS antal WHERE ---
Tak for hjælpen
Henning
| |
Ukendt (18-10-2007)
| Kommentar Fra : Ukendt |
Dato : 18-10-07 10:43 |
|
"Christian R. Larsen" <crlarsen@hotmail.com> wrote in message
news:471704a7$0$90270$14726298@news.sunsite.dk...
> "Henning Smed" <henning snabela smeds.dk> wrote in message
> news:4715db33$0$2682$d40e179e@nntp06.dk.telia.net...
>> Hej,
>>
> Indeholder tblIncidentUpdate et timestamp eller et andet datostempel, som
> du kan sortere efter, for at få vist den seneste record først?
>
> I så fald ... ORDER BY <timestamp> LIMIT 1
Hej Igen Christian,
Jeg kan ikke få LIMIT 1 til at fungere:
SQLstmt = "SELECT UpdateText, UpdateBy FROM tblIncidentUpdate WHERE
IncidentId =" & rs("IncidentNo") & " ORDER BY UpdateId ASC"
Fungerer fint men:
SQLstmt = "SELECT UpdateText, UpdateBy FROM tblIncidentUpdate WHERE
IncidentId =" & rs("IncidentNo") & " ORDER BY UpdateId ASC LIMIT 1"
Giver fejlen:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access Driver] Syntax error in ORDER BY clause
M.v.h.
Henning
| |
Ukendt (18-10-2007)
| Kommentar Fra : Ukendt |
Dato : 18-10-07 10:50 |
|
"Henning Smed" <henning snabela smeds.dk> wrote in message
news:47172aa0$0$2673$d40e179e@nntp06.dk.telia.net...
>
> "Christian R. Larsen" <crlarsen@hotmail.com> wrote in message
> news:471704a7$0$90270$14726298@news.sunsite.dk...
>> "Henning Smed" <henning snabela smeds.dk> wrote in message
>> news:4715db33$0$2682$d40e179e@nntp06.dk.telia.net...
>>> Hej,
>>>
>> Indeholder tblIncidentUpdate et timestamp eller et andet datostempel, som
>> du kan sortere efter, for at få vist den seneste record først?
>>
>> I så fald ... ORDER BY <timestamp> LIMIT 1
> Hej Igen Christian,
>
> Jeg kan ikke få LIMIT 1 til at fungere:
>
Efter lidt søgning viser det sig at LIMIT fungerer i MySql men ikke i MsSql
http://www.google.dk/search?hl=da&q=MsSql+LIMIT+1&meta=
M.v.h.
Henning
| |
Christian R. Larsen (18-10-2007)
| Kommentar Fra : Christian R. Larsen |
Dato : 18-10-07 11:11 |
|
"Henning Smed" <henning snabela smeds.dk> wrote in message
news:47172c3c$0$2680$d40e179e@nntp06.dk.telia.net...
> "Henning Smed" <henning snabela smeds.dk> wrote in message
> news:47172aa0$0$2673$d40e179e@nntp06.dk.telia.net...
>>
>> "Christian R. Larsen" <crlarsen@hotmail.com> wrote in message
>> news:471704a7$0$90270$14726298@news.sunsite.dk...
>>> "Henning Smed" <henning snabela smeds.dk> wrote in message
>>> news:4715db33$0$2682$d40e179e@nntp06.dk.telia.net...
>>>> Hej,
>>>>
>>> Indeholder tblIncidentUpdate et timestamp eller et andet datostempel,
>>> som du kan sortere efter, for at få vist den seneste record først?
>>>
>>> I så fald ... ORDER BY <timestamp> LIMIT 1
>> Hej Igen Christian,
>>
>> Jeg kan ikke få LIMIT 1 til at fungere:
>>
> Efter lidt søgning viser det sig at LIMIT fungerer i MySql men ikke i
> MsSql
Nej, der skal du i stedet bruge SELECT TOP 1 FROM ...
| |
Christian R. Larsen (18-10-2007)
| Kommentar Fra : Christian R. Larsen |
Dato : 18-10-07 11:10 |
|
"Henning Smed" <henning snabela smeds.dk> wrote in message
news:47172aa0$0$2673$d40e179e@nntp06.dk.telia.net...
>
> "Christian R. Larsen" <crlarsen@hotmail.com> wrote in message
> news:471704a7$0$90270$14726298@news.sunsite.dk...
>> "Henning Smed" <henning snabela smeds.dk> wrote in message
>> news:4715db33$0$2682$d40e179e@nntp06.dk.telia.net...
>>> Hej,
>>>
>> Indeholder tblIncidentUpdate et timestamp eller et andet datostempel, som
>> du kan sortere efter, for at få vist den seneste record først?
>>
>> I så fald ... ORDER BY <timestamp> LIMIT 1
> Hej Igen Christian,
>
> Jeg kan ikke få LIMIT 1 til at fungere:
>
> SQLstmt = "SELECT UpdateText, UpdateBy FROM tblIncidentUpdate WHERE
> IncidentId =" & rs("IncidentNo") & " ORDER BY UpdateId ASC"
>
> Fungerer fint men:
>
> SQLstmt = "SELECT UpdateText, UpdateBy FROM tblIncidentUpdate WHERE
> IncidentId =" & rs("IncidentNo") & " ORDER BY UpdateId ASC LIMIT 1"
>
> Giver fejlen:
> Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
> [Microsoft][ODBC Microsoft Access Driver] Syntax error in ORDER BY clause
Umiddelbart ville jeg droppe ASC. Den siger jo, der er fejl i ORDER BY -
udtrylkket.
| |
Ukendt (18-10-2007)
| Kommentar Fra : Ukendt |
Dato : 18-10-07 09:15 |
|
"Henning Smed" <henning snabela smeds.dk> wrote in message
news:4715db33$0$2682$d40e179e@nntp06.dk.telia.net...
> Hej,
>
> Jeg har brug for at sammenkæde og liste indholdet af 2 tabeller med SQL
> SELECT:
>
> Fra tabellen 'tblIncidentLog' henter jeg foregående måned med:
>
> SQLstmt = "SELECT IncidentNo, DisplayDate, DisplayTime,InitRptBy,
> OffRptBy, MonthlyRepType, Status, IncidentReported FROM tblIncidentLog
> WHERE DisplayDate > DateAdd('m',-1,Now()) ORDER BY " & x & ""
>
> Fra tabellen 'tblIncidentUpdate' skal jeg derefter hente 'UpdateText,
> UpdateBy' fra sidste record 'WHERE IncidentId =" & rs("IncidentNo")' fra
> ovenstående søgning.
>
> Kan nogen i gruppen hjælpe med en løsning på at finde sidste record i en
> tabellen 'tblIncidentUpdate' hvor 'IncidentId = rs("IncidentNo")' og
> eventuelt sammenkæde de 2 søgninger i en SQL sætning?
>
Min løsning blev indtil videre:
Jeg kontroller om "UpdateDate" i den første tabel 'tblIncidentLog'
eksisterer og kører forespørgsel i 'tblIncidentUpdate' og en loop for at
tælle antal records og finde sidste record.
Der vil være et meget begrænset antal records i 'tblIncidentUpdate' så
loop'n påvirker ikke hastigheden mærkbart. Men det må kunne løses mere
elegant.
<%
SQLstmt = "SELECT IncidentNo, DisplayDate, UpdateDate,
DisplayTime,InitRptBy, OffRptBy,
MonthlyRepType, Status, IncidentReported FROM tblIncidentLog WHERE
DisplayDate > DateAdd('m',-1,Now()) ORDER BY " & x & ""
%>
og derefter:
<%
IF rs("UpdateDate") = "" OR NOT IsNull(rs("UpdateDate")) THEN
' get Updated incident from DB by UpdateId
SQLstmt = "SELECT UpdateText, UpdateBy FROM tblIncidentUpdate WHERE
IncidentId =" & rs("IncidentNo")
Conn.Execute(SQLstmt)
Set rsUpdate = Conn.Execute(SQLstmt)
IF NOT rsUpdate.EOF THEN
Dim UpdateNo
UpdateNo=0
DO WHILE NOT rsUpdate.EOF
UpdateNo=UpdateNo + 1
UpdateBy = rsUpdate("UpdateBy")
UpdateText=left((rsUpdate("UpdateText")),150)
rsUpdate.MoveNext
LOOP
%>
M.v.h.
Henning
| |
Ukendt (18-10-2007)
| Kommentar Fra : Ukendt |
Dato : 18-10-07 11:55 |
|
"Henning Smed" <henning snabela smeds.dk> wrote in message
news:47171609$0$2667$d40e179e@nntp06.dk.telia.net...
>
<%
> SQLstmt = "SELECT IncidentNo, DisplayDate, UpdateDate,
> DisplayTime,InitRptBy, OffRptBy,
> MonthlyRepType, Status, IncidentReported FROM tblIncidentLog WHERE
> DisplayDate > DateAdd('m',-1,Now()) ORDER BY " & x & ""
> %>
> og derefter:
>
>
Hvilken MsSql søgning vil være hurtigst hvis forudsætningen er at record
sættet 'rsUpdate' indeholder max 6 poster pr LOOP og søgninggen gentages
1000 gange ?
1. Som loop med 1 MsSql opslag:
<%
IF rs("UpdateDate") = "" OR NOT IsNull(rs("UpdateDate")) THEN
' get Updated incident from DB by UpdateId
SQLstmt = "SELECT UpdateText, UpdateBy FROM tblIncidentUpdate WHERE
IncidentId =" & rs("IncidentNo")
Conn.Execute(SQLstmt)
Set rsUpdate = Conn.Execute(SQLstmt)
IF NOT rsUpdate.EOF THEN
Dim UpdateNo
UpdateNo=0
DO WHILE NOT rsUpdate.EOF
UpdateNo=UpdateNo + 1
UpdateBy = rsUpdate("UpdateBy")
UpdateText=left((rsUpdate("UpdateText")),150)
rsUpdate.MoveNext
LOOP
%>
2. Uden loop men med 2 MsSql opslag:
<%
IF rs("UpdateDate") = "" OR NOT IsNull(rs("UpdateDate")) THEN
' Get No of incident Updates and latest Update from DB by UpdateId
SQLstmt = "SELECT COUNT(UpdateId) AS antal FROM tblIncidentUpdate WHERE
IncidentId =" & rs("IncidentNo")
Conn.Execute(SQLstmt)
Set rsNo = Conn.Execute(SQLstmt)
UpdateNo = rsNo("Antal")
rsNo.Close
SQLstmt = "SELECT TOP 1 UpdateText, UpdateBy FROM tblIncidentUpdate WHERE
IncidentId =" & rs("IncidentNo") & " ORDER BY UpdateId DESC"
Conn.Execute(SQLstmt)
Set rsUpdate = Conn.Execute(SQLstmt)
UpdateBy = rsUpdate("UpdateBy")
UpdateText=left((rsUpdate("UpdateText")),150)
rsUpdate.Close
%>
M.v.h.
Henning
| |
Christian R. Larsen (18-10-2007)
| Kommentar Fra : Christian R. Larsen |
Dato : 18-10-07 13:31 |
|
"Henning Smed" <henning snabela smeds.dk> wrote in message
news:47173b75$0$2677$d40e179e@nntp06.dk.telia.net...
> Hvilken MsSql søgning vil være hurtigst hvis forudsætningen er at record
> sættet 'rsUpdate' indeholder max 6 poster pr LOOP og søgninggen gentages
> 1000 gange ?
Jeg vil anbefale dig at flytte data til et array frem for at loope gennem
recordsettet.
MyArray = RS.Getrows()
Herefter ligger recordsettet som kolonner og rækker i dit array. Dete
performer langt bedre end at skulle stå og læse og skrive til og fra
databasen hele tiden.
| |
Ukendt (18-10-2007)
| Kommentar Fra : Ukendt |
Dato : 18-10-07 13:48 |
|
"Christian R. Larsen" <crlarsen@hotmail.com> wrote in message
news:471751f2$0$90265$14726298@news.sunsite.dk...
> "Henning Smed" <henning snabela smeds.dk> wrote in message
> news:47173b75$0$2677$d40e179e@nntp06.dk.telia.net...
>> Hvilken MsSql søgning vil være hurtigst hvis forudsætningen er at record
>> sættet 'rsUpdate' indeholder max 6 poster pr LOOP og søgninggen gentages
>> 1000 gange ?
>
> Jeg vil anbefale dig at flytte data til et array frem for at loope gennem
> recordsettet.
>
> MyArray = RS.Getrows()
>
> Herefter ligger recordsettet som kolonner og rækker i dit array. Dete
> performer langt bedre end at skulle stå og læse og skrive til og fra
> databasen hele tiden.
>
Hej Christian,
Tak for dir svar.
Jeg ved ikke hvordan man anvender data gemt i et array, men hvis det kan
forbedre hastigheden når jeg skal liste < 1000 records vil jeg forsøge at
finde info om arrays.
Gemmer jeg alle records i et array lige efter Sql søgningen, lukker record
sættet og lister derefter data fra indholdet array ?
M.v.h.
Henning
| |
Christian R. Larsen (19-10-2007)
| Kommentar Fra : Christian R. Larsen |
Dato : 19-10-07 10:12 |
|
"Henning Smed" <henning snabela smeds.dk> wrote in message
news:471755ec$0$2679$d40e179e@nntp06.dk.telia.net...
>
> "Christian R. Larsen" <crlarsen@hotmail.com> wrote in message
> news:471751f2$0$90265$14726298@news.sunsite.dk...
>> "Henning Smed" <henning snabela smeds.dk> wrote in message
>> news:47173b75$0$2677$d40e179e@nntp06.dk.telia.net...
>>> Hvilken MsSql søgning vil være hurtigst hvis forudsætningen er at record
>>> sættet 'rsUpdate' indeholder max 6 poster pr LOOP og søgninggen
>>> gentages 1000 gange ?
>>
>> Jeg vil anbefale dig at flytte data til et array frem for at loope gennem
>> recordsettet.
>>
>> MyArray = RS.Getrows()
>>
>> Herefter ligger recordsettet som kolonner og rækker i dit array. Dete
>> performer langt bedre end at skulle stå og læse og skrive til og fra
>> databasen hele tiden.
>>
> Hej Christian,
>
> Tak for dir svar.
>
> Jeg ved ikke hvordan man anvender data gemt i et array, men hvis det kan
> forbedre hastigheden når jeg skal liste < 1000 records vil jeg forsøge at
> finde info om arrays.
> Gemmer jeg alle records i et array lige efter Sql søgningen, lukker record
> sættet og lister derefter data fra indholdet array ?
Ja.
Arrays er nemme at bruge.
Et recordset med 5 kolonner og 100 rækker vil eksempelvis kunne bruges som
følger:
....
MyArray = RS.getrows()
RS.close
For x = 1 to ubound(MyArray,2)
Felt1 = MyArray (0, x)
Felt2 = MyArray (1, x)
Felt3 = MyArray (2, x)
Felt4 = MyArray (3, x)
Felt5 = MyArray (4, x)
next
| |
Ukendt (20-10-2007)
| Kommentar Fra : Ukendt |
Dato : 20-10-07 12:37 |
|
"Christian R. Larsen" <crlarsen@hotmail.com> skrev i en meddelelse
news:471874ed$0$90274$14726298@news.sunsite.dk...
> "Henning Smed" <henning snabela smeds.dk> wrote in message
> news:471755ec$0$2679$d40e179e@nntp06.dk.telia.net...
>>
>> "Christian R. Larsen" <crlarsen@hotmail.com> wrote in message
>> news:471751f2$0$90265$14726298@news.sunsite.dk...
>>> "Henning Smed" <henning snabela smeds.dk> wrote in message
>>> news:47173b75$0$2677$d40e179e@nntp06.dk.telia.net...
>>>> Hvilken MsSql søgning vil være hurtigst hvis forudsætningen er at
>>>> record sættet 'rsUpdate' indeholder max 6 poster pr LOOP og søgninggen
>>>> gentages 1000 gange ?
>>>
>>> Jeg vil anbefale dig at flytte data til et array frem for at loope
>>> gennem recordsettet.
>>>
>>> MyArray = RS.Getrows()
>>>
>>> Herefter ligger recordsettet som kolonner og rækker i dit array. Dete
>>> performer langt bedre end at skulle stå og læse og skrive til og fra
>>> databasen hele tiden.
>>>
>> Hej Christian,
>>
>> Tak for dir svar.
>>
>> Jeg ved ikke hvordan man anvender data gemt i et array, men hvis det kan
>> forbedre hastigheden når jeg skal liste < 1000 records vil jeg forsøge at
>> finde info om arrays.
>> Gemmer jeg alle records i et array lige efter Sql søgningen, lukker
>> record sættet og lister derefter data fra indholdet array ?
>
> Ja.
>
> Arrays er nemme at bruge.
>
> Et recordset med 5 kolonner og 100 rækker vil eksempelvis kunne bruges som
> følger:
>
> ...
> MyArray = RS.getrows()
> RS.close
>
> For x = 1 to ubound(MyArray,2)
>
> Felt1 = MyArray (0, x)
> Felt2 = MyArray (1, x)
> Felt3 = MyArray (2, x)
> Felt4 = MyArray (3, x)
> Felt5 = MyArray (4, x)
>
> next
Hej Christian,
Jeg har prøver at liste 1200 rækker og 8 kolonner ved at flytte record
sættet til et array, og hastigheden er langt bedre.
Tak for hjælpen
Henning
| |
|
|