2016-08-23 1 views
0

У меня есть некоторые данные о магазинах, что выглядит примерно так:SQLite внутреннего соединение, кажется, производит повторяющиеся строки и, возможно, отбрасывает некоторые другие строки

have

где опущено неважные данные.

У меня есть существующий SQLite запрос:

select s.COMSERNO, s.COMNAME, COMALTNAME, s.COMCODE, s.COMADDR, s.COMPCODE, s.COMCITY, x.lastVisit, y.memoText, l.COMCALL 

from TCOMPANY s 

left outer join (select COMSERNO, max(CALEDATE || CALESTART) as lastVisit from TCALENTR where SALMSERN='000000000000019' and (CALEDATE || CALESTART) < strftime('%Y%m%d%H%M', 'now', 'localtime') group by COMSERNO) x on (x.COMSERNO=s.COMSERNO) 

left outer join (select MEMOSERN1 as comSerno, max(MEMOTEXT) as memoText from TMEMO where MEMOTYPE='0' and 0<length(MEMOTEXT) and MEMOSERN2 in ('Notes')group by MEMOSERN1) y on (y.comSerno=s.COMSERNO) 

left outer join LSALCOM l on l.COMSERNO=s.COMSERNO 

and SALMSERN='000000000000019' 

order by s.COMNAME, s.COMSERNO 

Вышеизложенные возвращает 174 строк.

Я хочу, чтобы показать «цепи» для магазина, если он есть, так что данные должны выглядеть следующим образом:

want

У меня есть еще одна таблица, LCOMCOM и для каждого COMSERNO в мой исходный результирующий набор (каждый магазин) Мне нужно определить, является ли этот магазин частью цепочки, и если это так, отобразите эту цепочку.

Я присоединяюсь LCOMCOM на COMSERN2, и если столбец LCOMATR1 имеет значение «Chain», то это означает, что магазин COMSERN2 является цепью. Затем я возьму COMSERN1 от LCOMCOM и воспользуюсь оригинальной таблицей, TCOMPANY, чтобы посмотреть и показать название Цепочки. Вот мой код

case when z.lcomatr1 = 'Chain' then (select p.COMNAME from TCOMPANY p inner join LCOMCOM q on (p.COMSERNO=q.COMSERN2) where q.COMSERN1 = z.comsern1) else '' end as Chain

Вот LCOMCOM присоединиться:

inner join LCOMCOM z on (s.COMSERNO=z.COMSERN2)

Я пытался добавить две вышеупомянутые части в мой запрос, но он не делает то, что я ожидал:

select s.COMSERNO, s.COMNAME, COMALTNAME, s.COMCODE, s.COMADDR, s.COMPCODE, s.COMCITY, x.lastVisit, y.memoText, l.COMCALL, 

case when z.lcomatr1 = 'Chain' then (select p.COMNAME from TCOMPANY p inner join LCOMCOM q on (p.COMSERNO=q.COMSERN2) where q.COMSERN1 = z.comsern1) else '' end as Chain 

from TCOMPANY s 

left outer join (select COMSERNO, max(CALEDATE || CALESTART) as lastVisit from TCALENTR where SALMSERN='000000000000019' and (CALEDATE || CALESTART) < strftime('%Y%m%d%H%M', 'now', 'localtime') group by COMSERNO) x on (x.COMSERNO=s.COMSERNO) 

left outer join (select MEMOSERN1 as comSerno, max(MEMOTEXT) as memoText from TMEMO where MEMOTYPE='0' and 0<length(MEMOTEXT) and MEMOSERN2 in ('Notes')group by MEMOSERN1) y on (y.comSerno=s.COMSERNO) 

left outer join LSALCOM l on l.COMSERNO=s.COMSERNO 

inner join LCOMCOM z on (s.COMSERNO=z.COMSERN2) 

and SALMSERN='000000000000019' 

order by s.COMNAME, s.COMSERNO 

Приведенный выше результат 548 строк, а не 174. Некоторые магазины теперь находятся в 4 ряда, например:

4 rows

И некоторые магазины теперь в 2 ряда, например, так:

enter image description here

Добавление DISTINCT после первоначального SELECT уменьшает счетчика строк 348 и теперь он выглядит как все цепи магазины находятся в 2 рядах.

Я не уверен, что здесь происходит, но, предположительно, ссылается на TCOMPANY два раза в обоих случаях: SELECT s неверен. Может ли кто-нибудь сказать мне, как получить 174 строки с цепочкой, если это необходимо?

ответ

0

CASE заявление не было необходимости и INNER JOIN был перемещен в квадратные скобки SELECT:

select DISTINCT s.COMSERNO, s.COMNAME, COMALTNAME, s.COMCODE, s.COMADDR, s.COMPCODE, s.COMCITY, x.lastVisit, y.memoText, l.COMCALL, 

(select p.comname from LCOMCOM q inner join TCOMPANY p on (p.COMSERNO=q.COMSERN1) where q.COMSERN2 = s.comserno and q.lcomatr1 = 'Chain') as Chain 

from TCOMPANY s 

left outer join (select COMSERNO, max(CALEDATE || CALESTART) as lastVisit from TCALENTR where SALMSERN='000000000000019' and (CALEDATE || CALESTART) < strftime('%Y%m%d%H%M', 'now', 'localtime') group by COMSERNO) x on (x.COMSERNO=s.COMSERNO) 

left outer join (select MEMOSERN1 as comSerno, max(MEMOTEXT) as memoText from TMEMO where MEMOTYPE='0' and 0<length(MEMOTEXT) and MEMOSERN2 in ('Notes')group by MEMOSERN1) y on (y.comSerno=s.COMSERNO) 

left outer join LSALCOM l on l.COMSERNO=s.COMSERNO 

and SALMSERN='000000000000019' 

order by s.COMNAME, s.COMSERNO 
Смежные вопросы