2

我有以下 SQL 查询:

SELECT 
   r.BEZEICHNUNG AS BEZEICHNUNG, r.ID AS ID, ra.BEZEICHNUNG AS raumBEZEICHNUNG, 
   ra.ID AS raumID 
FROM RAUM r, RAUMATTRIBUTE ra 
INNER JOIN RAZUORDNUNG ON RAZUORDNUNG.RAUM_ID = RAUM.ID
INNER JOIN RAUMATTRIBUTE ON RAZUORDNUNG.RAUMATTRIBUTE_ID = RAUMATTRIBUTE.ID 
WHERE 
    RAUMKLASSE_ID = ISNULL(@Raumklasse_ID, RAUMKLASSE_ID) 
    AND STADT_ID = ISNULL(@Stadt_ID, STADT_ID) 
    AND GEBAEUDE_ID = ISNULL(@Gebaeude_ID, GEBAEUDE_ID) 
    AND REGION_ID = ISNULL(@Region_ID, REGION_ID)

如果我使用该查询,我会收到一个错误:

多部分标识符 &RAUM.ID; 无法绑定。`

为什么会这样,我该如何解决?

4

3 回答 3

4

由于您已经为您的表定义了一个表别名RAUM(在 中FROM RAUM r),您需要使用该表别名 - 所以使用r.ID而不是RAUM.ID

SELECT 
   r.BEZEICHNUNG AS BEZEICHNUNG, r.ID AS ID, ra.BEZEICHNUNG AS raumBEZEICHNUNG, 
   ra.ID AS raumID 
FROM RAUM r, RAUMATTRIBUTE ra   <== you're defining "r" to be alias for "RAUM"
INNER JOIN RAZUORDNUNG ON RAZUORDNUNG.RAUM_ID = RAUM.ID  <== you need to use "r.ID"
......  

此外,我强烈建议您停止使用逗号分隔表的“旧式”JOIN - 改用正确的 ANSI INNER JOIN 语法:

SELECT 
   r.BEZEICHNUNG AS BEZEICHNUNG, r.ID AS ID, 
   ra.BEZEICHNUNG AS raumBEZEICHNUNG, ra.ID AS raumID 
FROM RAUM r
INNER JOIN RAZUORDNUNG rz ON rz.RAUM_ID = r.ID
INNER JOIN RAUMATTRIBUTE ra ON rz.RAUMATTRIBUTE_ID = ra.ID 
WHERE 
    RAUMKLASSE_ID = ISNULL(@Raumklasse_ID, RAUMKLASSE_ID) 
    AND STADT_ID = ISNULL(@Stadt_ID, STADT_ID) 
    AND GEBAEUDE_ID = ISNULL(@Gebaeude_ID, GEBAEUDE_ID) 
    AND REGION_ID = ISNULL(@Region_ID, REGION_ID)

您没有在RAUM rand之间定义任何 JOIN 条件RAUMATTRIBUTE ra- 所以您基本上得到了 CROSS JOIN (笛卡尔积)。那是你要的吗?如果不是:在INNER JOIN语句中定义适当的 JOIN 条件。

于 2012-06-14T07:58:17.210 回答
1

好吧,您必须将第一个内部联接更改为r.Id

    SELECT r.BEZEICHNUNG AS BEZEICHNUNG, r.ID AS ID, ra.BEZEICHNUNG AS raumBEZEICHNUNG, ra.ID AS raumID FROM RAUM r, RAUMATTRIBUTE ra 
INNER JOIN RAZUORDNUNG ON RAZUORDNUNG.RAUM_ID = r.ID
 INNER JOIN RAUMATTRIBUTE ON RAZUORDNUNG.RAUMATTRIBUTE_ID = RAUMATTRIBUTE.ID WHERE RAUMKLASSE_ID = ISNULL(@Raumklasse_ID, RAUMKLASSE_ID) AND STADT_ID = ISNULL(@Stadt_ID, STADT_ID) AND GEBAEUDE_ID = ISNULL(@Gebaeude_ID, GEBAEUDE_ID) AND REGION_ID = ISNULL(@Region_ID, REGION_ID)
于 2012-06-14T07:57:08.177 回答
0
.
FROM RAUM r, RAUMATTRIBUTE ra 
INNER JOIN RAZUORDNUNG ON RAZUORDNUNG.RAUM_ID = RAUM.ID
.

RAUM 是 r 不是吗?

于 2012-06-14T07:58:26.657 回答