[
https://issues.jboss.org/browse/TEIID-4619?page=com.atlassian.jira.plugin...
]
Bram Gadeyne commented on TEIID-4619:
-------------------------------------
Hi Steven,
Adding l.infectionid = 880 as a predicate to the join does return the correct results.
I might have a reduced example but it's not completely the same. I've created a
second temporary table #tmp_adm2 that only contains 1 row (for the admission where
infection 880 belongs to). I've added the columns
lc.culturenr,lc.culturespecimennr,lc.culturesampleinsertts to be sure that the values for
the join columns are read correctly from cos2_link_culture.
The expected returned values for these queries are now only 2 lines (1 for each
lab_culture). However the fields sampleinsertts, specimennumber, culturenumber should be
filled out. In query 1 I can see that for the case where earlier 15 rows were missing
indeed also these columns are empty. If I change it to use #tmp_adm2 then these columns
are filled out.
{code:sql}
-- query 1: columns cl.* are empty for one of the 2 culture links.
select l.infectionid, l.id as linkid, lc.linkcultureid, lc.responsibleculture,
lc.culturealternative, cl.sampleinsertts, cl.specimennumber,
cl.culturenumber, cl.culturename, cl.quotation,
lc.antibiogramculturenr,lc.antibiogramspecimennr,lc.antibiogramsampleinsertts,
lc.culturenr,lc.culturespecimennr,lc.culturesampleinsertts
from #tmp_admissions adm
join cos2_links l on l.admissionid = cast(adm.patientid as string)
join cos2_link_culture lc on lc.linkid = l.id
left join cos2_lab_culture cl on cl.culturenumber = lc.culturenr and cl.specimennumber =
lc.culturespecimennr and cl.sampleinsertts = lc.culturesampleinsertts
{code}
{code:sql}
-- query 2: columns cl.* are filled out as expected
select l.infectionid, l.id as linkid, lc.linkcultureid, lc.responsibleculture,
lc.culturealternative, cl.sampleinsertts, cl.specimennumber,
cl.culturenumber, cl.culturename, cl.quotation,
lc.antibiogramculturenr,lc.antibiogramspecimennr,lc.antibiogramsampleinsertts,
lc.culturenr,lc.culturespecimennr,lc.culturesampleinsertts
from #tmp_adm2 adm
join cos2_links l on l.admissionid = cast(adm.patientid as string)
join cos2_link_culture lc on lc.linkid = l.id
left join cos2_lab_culture cl on cl.culturenumber = lc.culturenr and cl.specimennumber =
lc.culturespecimennr and cl.sampleinsertts = lc.culturesampleinsertts
{code}
I've added a file teiid_reduces_cases.txt that contains the query plans and debug logs
for both queries.
left join returns wrong results
-------------------------------
Key: TEIID-4619
URL:
https://issues.jboss.org/browse/TEIID-4619
Project: Teiid
Issue Type: Bug
Affects Versions: 9.0.4, 9.0.5
Reporter: Bram Gadeyne
Assignee: Steven Hawkins
Priority: Critical
Attachments: correct_result.txt, enclosed_queryplan.txt,
query1_enclosed_plan.txt, query1_plan.txt, query2_plan.txt, wrong_result.txt
I have the following situation.
I have a temporary table #tmp_admissions that contains 8047 rows.
In this first query there are 66290 results. However if I only look at the lines for
infectionid 880 then there are only 16 lines.
{code:sql}
select l.infectionid, l.id as linkid, lc.linkcultureid, lc.responsibleculture,
lc.culturealternative, cl.sampleinsertts, cl.specimennumber,
cl.culturenumber, cl.culturename, cl.quotation, ls.material, ls.sampletime,
abr.culturenumber as abgram_culturenumber,abr.antibiogrampart, abr.resisttype,
lc.antibiogramculturenr,lc.antibiogramspecimennr,lc.antibiogramsampleinsertts
from #tmp_admissions adm
join cos2_links l on l.admissionid = cast(adm.patientid as string)
join cos2_link_culture lc on lc.linkid = l.id
left join cos2_lab_culture cl on cl.culturenumber = lc.culturenr and cl.specimennumber
= lc.culturespecimennr and cl.sampleinsertts = lc.culturesampleinsertts
left join cos2_lab_sample ls on ls.inserttime = cl.sampleinsertts and
ls.specimennumber = cl.specimennumber
left join cos2_antibiogramresistences abr on abr.specimennumber = cl.specimennumber
and abr.culturenumber = cl.culturenumber and abr.sampleinsertts = cl.sampleinsertts
{code}
This query does almost the same but returns 30 rows (and is correct).
{code:sql}
select l.infectionid, l.id as linkid, lc.linkcultureid, lc.responsibleculture,
lc.culturealternative, cl.sampleinsertts, cl.specimennumber,
cl.culturenumber, cl.culturename, cl.quotation, ls.material, ls.sampletime,
abr.culturenumber as abgram_culturenumber,abr.antibiogrampart, abr.resisttype,
lc.antibiogramculturenr,lc.antibiogramspecimennr,lc.antibiogramsampleinsertts
from cos2_links l
join cos2_link_culture lc on lc.linkid = l.id
left join cos2_lab_culture cl on cl.culturenumber = lc.culturenr and cl.specimennumber =
lc.culturespecimennr and cl.sampleinsertts = lc.culturesampleinsertts
left join cos2_lab_sample ls on ls.inserttime = cl.sampleinsertts and ls.specimennumber =
cl.specimennumber
left join cos2_antibiogramresistences abr on abr.specimennumber = cl.specimennumber and
abr.culturenumber = cl.culturenumber and abr.sampleinsertts = cl.sampleinsertts
where l.infectionid = 880
{code}
cos2_link_culture contains 2 rows for this infectionid. The left join statements should
result in 15 rows for both rows. However the left join results in the first query for the
first row are null and to my understanding ignored. I'll attach the query plans for
both queries.
I should note that there is a one to many relation between infection and admission so
therefore infectionid is for the same admission.
Strangely enough if you enclode the first query in a group by query and count the rows it
does indeed return 2 times 15 for the specific groups (see enclosed_queryplan.txt).
--
This message was sent by Atlassian JIRA
(v7.2.3#72005)