CROSS JOIN фильтр - PullRequest
       10

CROSS JOIN фильтр

0 голосов
/ 16 декабря 2011

Мне нужно «изготовить» записи для запроса, но в то же время ограничить список значений, возвращаемых из таблицы «поиска».

Есть ли способ использовать «фильтр» CROSS JOIN, не прибегая к использованию встроенного представления?

Этот синтаксис работает как положено (я получаю желаемые результаты):

SELECT  E.ID,  
        M.VALUE,
        MT.ID, MT.NAME

FROM    ENCOUNTER E
CROSS JOIN (
      SELECT  ID, NAME
      FROM    MEASUREMENT_TYPE
      WHERE   ID IN ('6941','6946')
) MT
LEFT OUTER JOIN MEASURE M ON E.ID=M.ENCOUNTER_ID
        AND MT.ID=M.MEASURE_TYPE_ID

К сожалению, если я использую этот подход, мне нужно использовать объект Command с Crystal Reports, а не его собственный «Visual Linking Expert». Командные объекты меня раздражают.

Добавление фильтра в предложение WHERE приводит к равному соединению, что нежелательно в этой ситуации.

Ответы [ 2 ]

1 голос
/ 16 декабря 2011

В этом случае inner join будет делать то же самое, что и ваш cross join. Заменить:

CROSS JOIN (
      SELECT  ID, NAME
      FROM    MEASUREMENT_TYPE
      WHERE   ID IN ('6941','6946')
) MT

с

INNER JOIN MEASUREMENT_TYPE MT ON MT.ID IN ('6941','6946')
1 голос
/ 16 декабря 2011
SELECT
  E.ID,  
  M.VALUE,
  MT.ID,
  MT.NAME
FROM
  ENCOUNTER         AS E
CROSS JOIN
  MEASUREMENT_TYPE  AS MT
LEFT OUTER JOIN
  MEASURE           AS M
    ON  E.ID  = M.ENCOUNTER_ID
    AND MT.ID = M.MEASURE_TYPE_ID
WHERE
  MT.ID IN ('6941','6946')

В этом случае вы можете поместить фильтр в предложение WHERE, потому что это ЛЕВОЕ СОЕДИНЕНИЕ и вы фильтруете левую сторону запроса.

Если бы вы фильтровали таблицу Measure, фильтр должен был бы войти в предложение ON для LEFT JOIN.

Дополнительной альтернативой является INNER JOIN вместо CROSS JOIN и использование там фильтра.Это потому, что предложение ON на самом деле не требует для ссылки на обе таблицы ...

  ENCOUNTER         AS E
INNER JOIN
  MEASUREMENT_TYPE  AS MT
    ON MT.ID IN ('6941','6946')
...