2011-12-16 1 views
0

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

Есть ли способ использовать «фильтр» 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 приводит к равному соединению, что нежелательно в этой ситуации.

ответ

1
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') 

В этом случае вы можете поставить фильтр в ИНЕКЕ, потому что это LEFT JOIN и вы фильтрование оставило стороны запроса.

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


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

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

Это недопустимый SQL. '[' И ']' являются незаконными символами в идентификаторе SQL. –

+0

@a_horse_with_no_name - Глупый Оракул, который всегда меня заводит, и я никогда не узнаю. Но я люблю эти '[]' so :( – MatBailie

+0

Вы ответили так, как это было единственное, что могло быть реализовано в Crystal Reports. – craig

1

В этом случае 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')