Есть ли возможность сузить то, что я выбираю в своем запросе, используя несколько объединений и CTE с операторами? - PullRequest
0 голосов
/ 23 апреля 2020

Итак, я работаю с запросом, который выглядит примерно так (см. Ниже), и я пытаюсь вытащить только определенные поля, но у меня возникают проблемы с его выполнением. Любая интуиция будет принята с благодарностью.

WITH abc1 AS (
<some query that joins two tables together and lets say produces fields (a1,a2,a3)> ),

abc2 AS (
<some query that joins two tables together and lets say produces fields (b1,b2,b3)> ),

abc3 AS (
<some query that joins two tables together and lets say produces fields (c1,c2,c3)> )

SELECT * FROM abc1 

Это работает и так мне нужно.

LEFT JOIN abc2
ON abc1.a1 = abc2.b1

Допустим, я хочу только см. abc2.b2, а не abc2.b1 & ab c .b3 в окончательных результатах. Как мне сделать эту работу?

LEFT JOIN abc3
ON abc1.a1 = abc3.c1

Допустим, я хочу видеть только abc3.c3, а не abc3.c1 или abc3.c2. Кроме того, если в соединении между abc1 и abc3 выдается значение NULL, заполните 0, если есть совпадение, заполните 1. Примерно так:

CASE WHEN abc3.c1 IS NULL THEN 0 ELSE 1 END ACTIVE_IND

Я пытался это сделать (опубликовать операторы CTEs WITH) но это не сработало.

SELECT abc1.a1 abc1.a2 abc1.a3 abc2.b2 abc3.c3 ОТ (ВЫБРАТЬ * ОТ abc1

  LEFT JOIN abc2
  ON abc1.a1 = abc2.b1 

  LEFT JOIN abc3
  ON abc1.a1 = abc3.c1);

1 Ответ

1 голос
/ 23 апреля 2020

Просто укажите столбцы, которые вы хотите видеть в основном запросе, вместо *.

Например:

WITH abc1 AS (
  ...
abc2 AS (
  ...
abc3 AS (
  ...
)
SELECT
  abc1.*,  -- all columns from the first CTE
  abc2.b2, -- only b2 from the second CTE
  abc3.c3  -- only c3 from the third CTE
FROM abc1 
LEFT JOIN abc2 ON abc1.a1 = abc2.b1
LEFT JOIN abc3 ON abc1.a1 = abc3.c1
...