Если бы я был на вашем месте, я бы просто присоединил второй стол к первому, вот так:
SELECT DATE '1900-01-01' + floor(k1."DDate" / 1000) * INTERVAL '1' YEAR + (MOD(k1."DDate", 1000) - 1) * INTERVAL '1' DAY AS "Date",
ltrim((substr(k1."NR8", -6)), '0') AS "Nr",
CASE
WHEN k1."tEnd" = 240000 THEN
'23:59:59'
ELSE
REPLACE(to_char(k1."tEnd", '00,00,00'), ',', ':')
END AS "End",
REPLACE(to_char(k1."zBegin", '00,00,00'), ',', ':') AS "tStart",
k1."Doc1" AS "Doc",
k1."Order" AS "Order"
FROM "MP002"."KKI1001" k1
INNER JOIN "KKI1100" k2 ON k1."Doc1" = k2."Doc2" AND k2."Type" IN ('X', 'X1', 'X2')
WHERE k1."DDate" > 119000
AND k1."tFact" = 1
ORDER BY "Date",
"Order";
Вы можете переместить предложение k2."Type" in ('X', 'X1', 'X2') down into the
где`;на самом деле это не имеет значения для внутреннего объединения, где находится предикат фильтрации (это важно для внешних объединений, в зависимости от того, какие результаты вы ожидаете увидеть).
NB Я предполагаю, что KKI1100. "Doc1"это уникальный столбец.Если он не уникален, то я бы предложил использовать предикат exists
, например:
SELECT DATE '1900-01-01' + floor(k1."DDate" / 1000) * INTERVAL '1' YEAR + (MOD(k1."DDate", 1000) - 1) * INTERVAL '1' DAY AS "Date",
ltrim((substr(k1."NR8", -6)), '0') AS "Nr",
CASE
WHEN k1."tEnd" = 240000 THEN
'23:59:59'
ELSE
REPLACE(to_char(k1."tEnd", '00,00,00'), ',', ':')
END AS "End",
REPLACE(to_char(k1."zBegin", '00,00,00'), ',', ':') AS "tStart",
k1."Doc1" AS "Doc",
k1."Order" AS "Order"
FROM "MP002"."KKI1001" k1
WHERE k1."DDate" > 119000
AND k1."tFact" = 1
AND EXISTS (SELECT NULL
FROM "KKI1100" k2
WHERE k2."Type" in ('X', 'X1', 'X2')
AND k2."Doc1" = k1."Doc1")
ORDER BY "Date",
"Order";