Могу ли я отобразить лишние или отсутствующие строки в таблице B, когда в QGIS в настоящее время доступно только левое или внутреннее соединение SQL - PullRequest
0 голосов
/ 24 октября 2019

У меня есть Таблица A и Таблица B, которые представляют собой два шейп-файла, которые я импортировал в Geopackage, а затем соединил с помощью DB Manager в QGIS, чтобы получить вывод, показывающий, где изменились имя, длина кабеля или геометрия, с помощью следующего кода

Select a.name, A.cable_leng, a.geom, a.fid
     , case when a.name <> B.name and
                 a.cable_leng <> B.cable_leng
            then 'Cable Name and Length modified'
            when a.name <> B.name then 'Name'
            when a.cable_leng <> B.cable_leng then 'Cable Length Modified'
            when b.name is null then 'Deleted Cable'
       end Cables
      , case when a.geom <> B.geom then 'Geometry Modified'
            when a.geom = B.geom then 'No Geometry Changes'
       end Geometry
  from table_1 a
  inner join table_2 b
    on a.fid = b.fid

Я получаю следующий вывод на связанном изображении. Я доволен Вывод SQL

Пример данных Пример данных

Но я хотел бы знать, какие изменения я могу внести в свой запрос, чтобы показать, когда число строк между двумя таблицами может быть разным, дополнительным или отсутствующим. Из проведенного мною исследования мне может потребоваться сделать правильное соединение, но в настоящее время это невозможно с QGIS DB Manager, но затем я рассмотрел случай, когда в Таблице B может быть меньше строк. Поэтому я бы хотел показать, гдеесть значения NULL в любой Таблице только из левого соединения или я должен использовать другой тип запроса?

Как примечание, есть ли способ показать данные из Таблицы A и Таблицы B в выходных данных. Насколько я понимаю, нет способа упорядочить отображение столбцов в выходных данных, но было бы неплохо хотя бы увидеть значения, которые отличаются в одной таблице, даже если их нельзя упорядочить.

Редактировать: глядя на мой запрос еще раз, эта строка, вероятно, ничего не делает с левым соединением?

when b.name is null then 'Deleted Cable'

1 Ответ

0 голосов
/ 24 октября 2019

Используя левое объединение, вы также можете выбрать из таблицы_2 несовпадающие строки, соответствующие предложению соединения в таблице_1 для левого объединения, вы можете проверить проверку отсутствующего совпадения на наличие нулевого значения (например, используя объединение ifnull или аналогичное в зависимости от ваших возможностей БД) идля других чисел при сравнении вы должны установить нулевое значение как 0

    Select a.name, A.cable_leng, a.geom, a.fid
     , case when  a.cable_leng <> coalesce(B.cable_leng,0)
            then 'Cable Name and Length modified'
            when a.name <> coalesce(B.name, '')  then 'Name'
            when a.cable_leng <> coalesce(B.cable_leng,0) then 'Cable Length Modified'
            when b.name is null then 'Deleted Cable'
       end Cables
      , case when a.geom <> B.geom then 'Geometry Modified'
            when a.geom = B.geom then 'No Geometry Changes'
       end Geometry
  from table_1 a
  left  join table_2 b  on a.fid = b.fid
...