vandalsvq писал(а) 24. Марта 2009 :: 07:58:Александр (Orefkov) а почему бы не использовать запрос вроде
SELECT
J.DATE AS Date,
J.TIME AS Time,
J.IDDOC AS IDDOC,
COALESCE(D1.Contr, D2.Contr) AS Contr
J.idx_IDDOC AS [КлючПорядка]
FROM
Журнал AS J
LEFT JOIN
Документ_Один AS D1
ON
D1.IDDOC = J.IDDOC
LEFT JOIN
Документ_Два AS D2
ON
D2.IDDOC = J.IDDOC
WHERE
J.IDDOCDEF = :ВидДокумента.Один
OR
J.IDDOCDEF = :ВидДокумента.Два
Какие ты видишь минусы или проблемы?
Минусы - то что независимо от вида документа, по каждому iddoc из общего журнала sqlite будет ломится в каждую из таблиц шапок документов в поисках iddoc в шапке. Ведь как будет выполнятся этот запрос:
сначала во внешнем цикле перебираются строки в журнале.
Если iddocdef не попадает в where, строка журнала пропускается, переходим на следующую строку.
Иначе - берется iddoc из журнала и выполняется поиск этого iddoc в каждой из таблиц шапок документов, с вытаскиванием из них поля Поставщик.
Когда получили всех Поставщиков (либо NULL) из всех шапок, вычисляем coalesce.
Кроме того, это мы знаем, что данные left join'ы не изменят количество строк в выборке, потому как iddoc в шапках не повторяется.
SQLite этого не знает, и строит план выполнения с учетом того, что из таблиц шапок может быть получено несколько записей с указанным iddoc, то есть накручивает вложенные циклы.
А в моем варианте - при переборе строк журнала взависимости от iddocdef выполняется один подзапрос только к нужной таблице шапок.
Из минусов - так можно извернутся, когда требуется только одно поле из шапки документов, если так получать несколько полей, на каждое поле будет свой подзапрос к таблице шапки документов.
Ща я думаю, как оптимальней реализовать такую ситуацию.