пятница, 7 октября 2011 г.

Некорректный SQL-запрос SELECT в QSqlRelationalTableModel

Было замечено, что в QTableView, настроенном на QRelationalTableModel отображает не все строки таблицы, в частности строки, где значение хотя бы одного поля внешнего ключа (поля, у которых есть QRelation) равно NULL. Более того, оказалось, что эти строки отсутствуют и в модели.

Исследование показало, что QRelationalTableMode.selectStatement возвращает запрос следующего вида:
SELECT tbl.fld1,
       relTblAl_1.fld1 AS reftbl1_fld1_2,
       relTblAl_2.fld1,
       relTblAl_3.fld1,
       tbl.fld2,
       tbl.fld3,
FROM   tbl,
       reftbl1 relTblAl_1,
       reftbl1 relTblAl_2,
       reftbl2 relTblAl_3
WHERE  ( tbl.fkfld1 = relTblAl_1.pkfld
         AND tbl.fkfld2 = relTblAl_2.pkfld
         AND tbl.fkfld3 = relTblAl_3.pkfld )
ORDER  BY tbl.sortfld ASC 

Это INNER JOIN, который действительно не выбирает строки с пустыми ссылками. Выход напрашивается - переписать selectStatement, что бы он возвращал правильный запрос, использующий LEFT JOIN. Тогда выберутся все строки таблицы.