У меня есть некоторые данные о магазинах, что выглядит примерно так:SQLite внутреннего соединение, кажется, производит повторяющиеся строки и, возможно, отбрасывает некоторые другие строки
где опущено неважные данные.
У меня есть существующий 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 строк.
Я хочу, чтобы показать «цепи» для магазина, если он есть, так что данные должны выглядеть следующим образом:
У меня есть еще одна таблица, 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 ряда, например:
И некоторые магазины теперь в 2 ряда, например, так:
Добавление DISTINCT
после первоначального SELECT
уменьшает счетчика строк 348 и теперь он выглядит как все цепи магазины находятся в 2 рядах.
Я не уверен, что здесь происходит, но, предположительно, ссылается на TCOMPANY
два раза в обоих случаях: SELECT
s неверен. Может ли кто-нибудь сказать мне, как получить 174 строки с цепочкой, если это необходимо?