never mind, sorted all the rest out myself..
the resulting query =
SELECT employment.name AS JOB, skill.name AS
SKILL_REQUIRED FROM empLOyment, skill, skillneeded join personemployment
on personemployment.employmentid = employment.employmentid where
skillneeded.skillid = skill.skillid
AND
(employment.companyid = 1
or
employment.groupid in(Select Level1GroupID from company where companyid =
1))
and personemployment.personid =
1
and skillneeded.employmentid = employment.employmentid and employmentid
in
(select employmentid from personemployment where personid=1) GROUP BY
employment.name, skill.name
*PHEW*
thanks heaps for your help DONAVAN
XX
----- Original Message -----
Sent: Monday, February 17, 2003 9:51 AM
Subject: Re: [DUG]: sql... now i really need help
OOOH, and another important point to note,
the records returned are not accurate.
for example, office bitch only requires farting and
ghosting, but this query returns
OFFICE BITCH |
|
|
|
|
FARTING |
|
|
OFFICE BITCH |
|
|
|
|
GHOSTING |
|
|
OFFICE BITCH |
|
|
|
|
HAZ SUB |
|
|
OFFICE BITCH |
|
|
|
|
LONG TIME |
and supervisors have 5 skills required against them
but this query returns
SUPERVISORS |
|
|
|
|
FIRST AID CERT |
|
|
SUPERVISORS |
|
|
|
|
FORKLIFT LICENCE |
----- Original Message -----
Sent: Monday, February 17, 2003 9:00 AM
Subject: Re: [DUG]: sql... now i really need help
Getting close now, thanks. I only
want to return those jobs (and subsequent related skills) that a person is held
against in the person employment table.
ie person 1 may only be an office bitch, so i will
only want that employment returned. so the query now looks
like:
SELECT employment.name AS JOB, skill.name AS
SKILL_REQUIRED FROM empLOyment, skill, skillneeded join personemployment
on personemployment.employmentid = employment.employmentid WHERE
skillneeded.skillid = skill.skillid
AND
(employment.companyid = skill.companyid
OR
employment.groupid =
skill.groupid)
and personid = 1 GROUP BY employment.name, skill.name
I need to get employment.employmentid from this
query too, however when i trY to add another row to the query (AS BELOW) i
get a
Dynamic SQL
Error SQL error code = -104 invalid column reference
SELECT employment.name AS JOB, skill.name AS SKILL_REQUIRED,
employment.employmentid AS EMPLOYMENTID FROM empLOyment, skill,
skillneeded join personemployment on personemployment.employmentid =
employment.employmentid WHERE skillneeded.skillid = skill.skillid
AND
(employment.companyid = skill.companyid
OR
employment.groupid =
skill.groupid)
and personid = 1 GROUP BY employment.name,
skill.name
----- Original Message -----
Sent: Friday, February 14, 2003 4:05 PM
Subject: Re: [DUG]: sql... now i really need help
T,
Dont you want SQL that is:
SELECT employment.name AS JOB,
skill.name AS 'SKILL REQUIRED' FROM empolyment, skill, skillneeded WHERE skillneeded.skillid = skill.skillid
AND
employment.companyid = skill.companyid
AND
employment.groupid = skill.groupid GROUP BY employment.name, skill.name
That would return a dataset as
follows:
JOB(employment.name)
SKILL
REQUIRED(skill.name) ------------------------------------------------------------------------------------------------------------------- SUPERVISORS
HAZ
SUB SUPERVISORS
FARTING SUPERVISORS
LONG
TIME SUPERVISORS
GHOSTING
SUPERVISORS
FORKLIFT
LICENCE SUPERVISORS
FIRST AID CERT FORKLIFT
DRIVER
HAZ SUB FORKLIFT
DRIVER
FIRST AID CERT OFFICE
BITCH
FARTING OFFICE
BITCH
GHOSTING If you were using say a DevExpress DataGrid (http://www.devexpress.com/products/vcl/f_g402.asp) then you
could use the grid to group on JOB and visually you would have what is required.
I suspect you are trying to get a result set back here that you can just dump
into DB aware controls and it will look "good" SQL is not really good at that.
You are always going to get set orientated data (as per my result set) that is
not always going to go well into your DB aware controls. You may have to
introduce a layer on top of your data retrieval that you can pass to your
presentation layer.
At 13:28 14/02/2003 +1300, you wrote:
The result
set im after is this: JOB(employment.name)
SKILL
REQUIRED(skill.name) ------------------------------------------------------------------------------------------------------------------- SUPERVISORS
HAZ
SUB
FARTING
LONG
TIME
GHOSTING
FORKLIFT
LICENCE
FIRST AID CERT FORKLIFT
DRIVER
HAZ
SUB
FIRST AID CERT OFFICE BITCH
FARTING
GHOSTING (that is for now anyway
- eventually i want to have a "current" shown if this person has the skill,
and "not current" if they do not have it - but one hurdle at a
time.) er.. data dictionary? I
think this is the best IBAdmin can do (of course please correct me if I'm
wrong) /***********************************/ /*
Tables
*/ /***********************************/ /* Table: COMPANY */ CREATE TABLE COMPANY
( NAME VARCHAR(20) NOT
NULL, DIRECTORY
VARCHAR(65), COMPANYID INTEGER NOT
NULL, EMAIL
VARCHAR(50), SAFETYCONTACT
VARCHAR(50), SAFETYPHONE
VARCHAR(20), MANAGERNAME
VARCHAR(50), MANAGERPHONE
VARCHAR(20), LEVEL1GROUPID INTEGER NOT
NULL, CONSTRAINT PK_COMPANY PRIMARY KEY
(COMPANYID) ); /* Table:
EMPLOYMENT */ CREATE TABLE EMPLOYMENT
( EMPLOYMENTID INTEGER NOT
NULL, NAME VARCHAR(100) NOT
NULL, GROUPID
INTEGER, COMPANYID
INTEGER, CONSTRAINT EMPLOYMENT_PK PRIMARY
KEY (EMPLOYMENTID) ); /* Table:
PERSON */ CREATE TABLE PERSON
( PERSONID INTEGER NOT
NULL, NAME VARCHAR(20) NOT
NULL, PERSONTYPEID INTEGER NOT
NULL, EMAIL
VARCHAR(50), PHONE
VARCHAR(20), NOTES BLOB SUB_TYPE
0, ISACTIVE
INTEGER, COMPANYID INTEGER NOT
NULL, STAFFCODE
NUMERIC(15,2), SICKDAYHOURS
INTEGER, CONSTRAINT PK_PERSON PRIMARY KEY
(PERSONID) ); /* Table:
PERSONEMPLOYMENT */ CREATE TABLE PERSONEMPLOYMENT
( PERSONEMPLOYMENTID INTEGER NOT
NULL, PERSONID INTEGER NOT
NULL, EMPLOYMENTID INTEGER NOT
NULL, COMMENCEDATE DATE NOT
NULL, CONSTRAINT PERSONEMPLOYMENT_PK PRIMARY
KEY (PERSONEMPLOYMENTID) ); /*
Table: PROVIDER */ CREATE TABLE PROVIDER
( PROVIDERID INTEGER NOT
NULL, NAME VARCHAR(100) NOT
NULL, COMPANYID INTEGER NOT
NULL, CONSTRAINT PROVIDER_PK PRIMARY KEY
(PROVIDERID) ); /* Table:
SKILL */ CREATE TABLE SKILL (
SKILLID INTEGER NOT NULL, NAME
VARCHAR(100) NOT NULL, TIMEVALID
INTEGER NOT NULL, /*this
field is to hold the amount of weeks a skill is valid
for*/ COMPANYID
INTEGER, GROUPID
INTEGER, CONSTRAINT SKILL_PK PRIMARY KEY
(SKILLID) ); /* Table:
SKILLATTEMPT */ CREATE TABLE SKILLATTEMPT
( SKILLATTEMPTID INTEGER NOT
NULL, SKILLID INTEGER NOT
NULL, PERSONID INTEGER NOT
NULL, ATTEMPTDATE DATE NOT
NULL, PROVIDERID INTEGER NOT
NULL, RESULT VARCHAR(1) NOT
NULL, /*P = PASSED F
= NOT PASSED D = DISQUALIFIED (IN THE CASE OF DRIVERS
LICENSE)*/ REF
VARCHAR(50), /*SUCH AS
DRIVERS LICENCE NUMBER ETC*/ COMMENTS
VARCHAR(1000), VALIDTO
DATE, CONSTRAINT SKILLATTEMPT_PK PRIMARY KEY
(SKILLATTEMPTID) ); /* Table:
SKILLNEEDED */ CREATE TABLE SKILLNEEDED
( SKILLNEEDEDID INTEGER NOT
NULL, EMPLOYMENTID INTEGER NOT
NULL, SKILLID INTEGER NOT
NULL, DATEBY
DATE, TIMEPERIODID
INTEGER /*NUMBER OF
WEEKS THIS SKILL MUST BE OBTAINED IN (FROM COMMENCE
DATE)*/, CONSTRAINT SKILLNEEDED_PK PRIMARY
KEY (SKILLNEEDEDID) ); /*
Table: TIMEPERIOD */ CREATE TABLE TIMEPERIOD
( TIMEPERIODID INTEGER NOT
NULL, WEEKS INTEGER NOT
NULL, CONSTRAINT TIMEPERIOD_PK PRIMARY KEY
(TIMEPERIODID) ); ----- Original Message ----- From:
Donovan J. Edye To: Multiple recipients of list delphi
Sent: Friday, February 14, 2003 12:17 PM Subject: Re:
[DUG]: sql... now i really need help
T,
What is the result set
you are trying to return? Perhaps nested queries are not what you need. Let us
have basic data dictionary and what result you want.
At 11:58
14/02/2003 +1300, you wrote:
oh dear,
no answers... not surprised now
instead of only returning the one same record every loop through, it is
showing ALL possible records even if they arent related: eg JOB
SKILL REQUIRED ------------------------------------------------------------------------------------------------------------------- SUPERVISORS
HAZ SUB
FARTING
LONG TIME
GHOSTING
FORKLIFT LICENCE
FIRST AID CERT
FORKLIFT
DRIVER
HAZ
SUB
FARTING
LONG
TIME
GHOSTING
FORKLIFT
LICENCE
FIRST AID CERT
could someone please look at my dodgy code and tell me why
this is not working?? this should be
reading: JOB
SKILL
REQUIRED ------------------------------------------------------------------------------------------------------------------- SUPERVISORS
HAZ
SUB
FARTING
LONG
TIME
GHOSTING
FORKLIFT
LICENCE
FIRST AID CERT FORKLIFT
DRIVER
HAZ
SUB
FIRST AID CERT
and heres my suspect
code: begin
with IBQuery2
do
begin
Close;
sQL.Clear;
SQL.Add('select s.name,
s.skillid');
SQL.Add('from skill
s');
SQL.Add('join skillneeded sn on sn.skillid =
s.skillid');
SQL.Add('where sn.employmentid =
:employmentid');
Prepare;
end;
with IBQuery1
do
begin
Close;
SQL.Clear;
SQL.Add('Select name from person where personid =
:personid');
ParamByName('PersonID').AsString
:=
Request.QueryFields.Values['person'];
Open;
sPerson :=
FieldByName('Name').AsString;
Str.Add('<tr><th><h3>Name</h3></th><th><h3>Job</h3></th><th><h3>Skill
Required</h3></th><th><h3></h3></th></tr>');
Str.Add('<tr><td colspan=4><b>' + sPerson +
'</b></td></tr>');
Close;
SQl.Clear;
SQL.Add('Select e.name,
e.employmentid');
SQL.Add('from employment
e');
SQL.Add('join personemployment pe on pe.employmentid =
e.employmentid');
SQL.Add('where pe.personid =
:PersonID');
ParamByName('PersonID').AsString
:=
Request.QueryFields.Values['person'];
open;
First;
while not eof
do
begin
sEmploymentID :=
FieldByName('EmploymentID').AsString;
Str.Add('<tr>');
Str.Add('<td></td><td><font size=3>'
+
FieldByName('Name').AsString
+
'</font></td><td></td><td></td></tr>');
IBQuery2.ParamByName('EmploymentID').AsString
:=
sEmploymentID;
IBQuery2.Open;
IBQuery2.First;
while (not IBQuery2.Eof)
do
begin
Str.Add('<tr><td></td><td></td><td><font
size=2>');
Str.Add(IBQuery2.FieldByName('Name').AsString);
Str.Add('</font></td><td></td></tr>');
IBQuery2.Next;
end;
next;
end;
end;
end Oh, and important point... WHEN I RUN THE QUERY IN IBADMIN
WITH THE EMPLOYMENTID HARD-ENTERED, IT RETURNS EXPECTED RECORDS. I
HAVE EVEN PRINTED OUT THE EMPLOYMENTID TO THE REPORT AND IT IS THE CORRECT
VALUE THROUGH THE LOOPS. probably something stupid..... ----- Original
Message ----- From: Tracey
Maule To: Multiple
recipients of list delphi Sent: Thursday, February 13, 2003
1:59 PM Subject: [DUG]: sql... could someone tell me why
please??
Hi I was having a problem with nested queries.. where the
first one was
Select distinct e.name,
e.employmentid
from employment
e
join personemployment pe on pe.employmentid =
e.employmentid
where pe.personid =
:PersonID
ParamByName('PersonID').AsString
:=
Request.QueryFields.Values['person']; then i did this: while not eof
do //display
e.name query2:
select
s.name
from skill
s
join skillneeded sn on sn.skillid =
s.skillid
where sn.employmentid = :employmentid
query2.open; while not query2.eof
do show
s.name this was showing some
weird results.. ie the second query was returning only one record, and it
was repeated under every employment name (even tho it had no relation to the
query1 record) I banged
my head for ages, then on a whim removed the distinct from my first query,
now all is well. Why???????????????????? Tracey Software Developer / Web Master Logis [EMAIL PROTECTED] (025)
213-1065 --
Donovan
----------------------------------------------------------------------
Donovan J. Edye [www.edye.wattle.id.au]
Namadgi Systems [www.namsys.com.au]
Voice: +61 2 6285-3460 Fax: +61 2 6285-3459 TVisualBasic =
Class(None); Heard just before the 'Big Bang': "...Uh Oh...."
----------------------------------------------------------------------
GXExplorer [http://www.gxexplorer.org]
Freeware Windows Explorer replacement. Also includes freeware delphi
windows explorer components.
----------------------------------------------------------------------
--
Donovan
----------------------------------------------------------------------
Donovan J. Edye [www.edye.wattle.id.au]
Namadgi Systems [www.namsys.com.au] Voice:
+61 2 6285-3460 Fax: +61 2 6285-3459 TVisualBasic = Class(None);
Heard just before the 'Big Bang': "...Uh Oh...."
----------------------------------------------------------------------
GXExplorer [http://www.gxexplorer.org]
Freeware Windows Explorer replacement. Also includes freeware delphi windows
explorer components.
----------------------------------------------------------------------
|