0

我需要为查询“制造”记录,但同时限制从“查找”表返回的值列表。

有没有办法使用“过滤”交叉连接而不必使用内联视图?

此语法按预期工作(我得到了预期的结果):

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 子句添加过滤器会导致相等连接,这在这种情况下是不可取的。

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 JOIN's ON 子句。


另一种选择是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 回答