0

クエリ用にレコードを「製造」する必要がありますが、同時に「ルックアップ」テーブルから返される値のリストを制限します。

インライン ビューを使用せずに 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

残念ながら、このアプローチを使用する場合、ネイティブの「Visual Linking Expert」ではなく、Crystal Reports で Command オブジェクトを使用する必要があります。コマンドオブジェクトは私を苛立たせます。

WHERE 句にフィルターを追加すると、この状況では望ましくない等結合になります。

4

2 に答える 2

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

この場合、フィルターを WHERE 句に入れることができます。これは LEFT JOINであり、クエリの左側をフィルター処理しているためです。

Measureテーブルをフィルター処理する場合、フィルターはのLEFT JOINON 句に入れる必要がありました。


追加の代替手段は、INNER JOIN代わりにCROSS JOINフィルターを使用することです。これは、ON 句が実際に両方のテーブルを参照する必要がないためです...

  ENCOUNTER         AS E
INNER JOIN
  MEASUREMENT_TYPE  AS MT
    ON MT.ID IN ('6941','6946')
于 2011-12-16T15:55:59.990 に答える
1

この場合、 aninner 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')
于 2011-12-16T15:57:28.977 に答える