【问题标题】:Select query with join condition error选择有连接条件错误的查询
【发布时间】:2014-01-31 11:36:25
【问题描述】:

我有一个选择查询来获取结果集,我的查询如下:

 SELECT T0."REFID", T0."REFID_NR", T0."ID_POS", 
 CASE 
    WHEN T4."REFID" IS NOT NULL 
    THEN T4."REFID"
 END AS "result"
FROM "SYSTEM"."T00_SOFT" T0
LEFT OUTER JOIN 
(
SELECT T1."REFID", T1."REFID_NR", T1."ID_POS",T1."ARTIKEL" ,T2."VEHW", T2."VNHW" , 
(((T2."VEHW"*100)/(T2."VNHW"))*((T1."ER_AW"*100)))/(T1."BAS_AW") AS "claims"
FROM "SYSTEM"."T00_SOFT" T1
INNER JOIN "SYSTEM"."T00_EG" T2
ON T1."REFID" = T2."REFID"
AND T1."ORGID_WE" = T2."ORGID"
AND T1."ARTIKEL" = T2."MATNR" ) T4;

当我执行查询时,我收到以下错误:

Could not execute 'SELECT T0."REFID", T0."REFID_NR", T0."ID_POS", CASE WHEN T4."REFID" IS NOT NULL THEN ...' in 42 ms 382 µs . 
SAP DBTech JDBC: [257] (at 521): sql syntax error: line 15 col 33 (at pos 521)

这里第 15 行是指最后一行,表示错误存在于T4。我没有发现任何遗漏。如果有人能提出什么问题?

谢谢

【问题讨论】:

  • 在 THEN 语句中,您需要在 T4 后面添加一些字段名称,您可以在此处引用一个别名...
  • @Sparky 你的意思是这样的吗?如果是这样,它仍然不能解决问题。
  • @Strawberry 你能用蹩脚的话解释一下吗?
  • 你需要 T4.,即 T4.Claims
  • 我做了必要的改变。但错误仍然存​​在。花了一个小时才弄清楚,但奇怪的是我不能。请帮忙:)

标签: mysql sql sql-server select hana


【解决方案1】:

您在 T0 和 T4 之间的联接中缺少 ON 条件。我会将您的查询修改为:

SELECT T0."REFID", T0."REFID_NR", T0."ID_POS", 
 CASE 
    WHEN T4."REFID" IS NOT NULL 
    THEN T4."REFID"
 END AS "result"
FROM "SYSTEM"."T00_SOFT" T0
LEFT OUTER JOIN 
    (
    SELECT T1."REFID", T1."REFID_NR", T1."ID_POS",T1."ARTIKEL" ,T2."VEHW", T2."VNHW" , 
    (((T2."VEHW"*100)/(T2."VNHW"))*((T1."ER_AW"*100)))/(T1."BAS_AW") AS "claims"
    FROM "SYSTEM"."T00_SOFT" T1
        INNER JOIN "SYSTEM"."T00_EG" T2
            ON T1."REFID" = T2."REFID"
                AND T1."ORGID_WE" = T2."ORGID"
                AND T1."ARTIKEL" = T2."MATNR" ) T4
    ON T0."REFID" = T4."REFID"

您加入了 T0 和 T4,但没有描述它们之间的关系。请记住,仅仅因为您在 From 子句中的子查询中定义了 TOO_SOFT 和 TOO_EG 如何相关,并不意味着 T0 和 T4 是如何相关的。根据我找到的参考手册here,左外连接和右外连接始终需要连接条件。

另外,我会犹豫是否使用没有 Else 语句的 Case 语句,因为如果 case 不正确,那么它将返回 NULL。如果这就是你想要的,那很好,但我怀疑你会从编程中受益,而不是完全忽略 Else 语句。

【讨论】:

  • 并且取决于数据类型,您很可能在该计算中进行整数数学运算。这可能不是你想要的。
【解决方案2】:
 SELECT T0."REFID", T0."REFID_NR", T0."ID_POS", 
 CASE 
    WHEN T4."REFID" IS NOT NULL 
    THEN T4."REFID"       ---<-- T4 is a Table Alias you need to mention 
 END AS "result"               -- the column name as well like T4.ColumnName

如果您只检查列中可能的空值,则可以使用 ISNULL 函数并在返回值为空时提供替代值。

类似这样的......

 SELECT T0."REFID"
       , T0."REFID_NR"
       , T0."ID_POS"
       , IFNULL(T4."REFID",'Sub_Value') AS "Result"

【讨论】:

  • 您的案例陈述中想要什么?你想SELECT T4."REFID" when T4."REFID" Is not null???
  • 好吧,我只是检查列 T4."REFID" 是否不为空然后选择 T4(即执行选择查询并将结果集保留在表 T4 中)。
  • @SangameshHs 抱歉,现在您已经在案例语句中使用了 AS 别名。在您的 Case 语句的 END 子句之后,在 CASE 语句的末尾提及您的别名。我已经更新了答案,现在看看。
  • 是的,现在错误指出了 T4 附近的最后一条语句,例如 'sql syntax error: line 15 col 33 (at pos 513)' 。好吧,我不明白为什么,因为我没有发现那里缺少任何东西:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
  • 2015-07-05
  • 2019-12-09
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多