【问题标题】:SQL-Select ends up in an Error when combinedSQL-Select 组合时出现错误
【发布时间】:2015-11-02 11:29:33
【问题描述】:

我尝试对一些重复项做一个简单的选择,但我的 sql 语句总是以这个错误结束:

命令未正确结束

我有一张这样的桌子

EAN              STR
=============    ====
8030524096397    AAAA
8030524096397    BBBB
8030524096731    XXXX
8030524096731    YYYY
8030524096324    CCCC

我的选择其实很简单

SELECT EAN, COUNT(*) FROM ean GROUP BY ean HAVING COUNT(*) > 1;

结果:

EAN               COUNT(*)
=============     ========
8030524096397        2
8030524096731        2

到这里为止一切都很好!现在我想要重复项的STR 并试试这个

SELECT * FROM EAN E 
    INNER JOIN ( SELECT EAN, COUNT(*) FROM ean GROUP BY ean HAVING COUNT(*) > 1 )  
R ON 
E.EAN = R.EAN;

但这会导致这个错误。

确实是这样说的:

SELECT * FROM EAN E
INNER JOIN ( SELECT EAN, COUNT(*) FROM ean GROUP BY ean HAVING COUNT(*) > 1 )  R ON
^
Error: Command not properly ended

我做错了什么?

数据库信息: Gupta Centura SQLBase 7.0.1

【问题讨论】:

  • @Simo 不,这不是问题,我现在已经测试过了。添加AS导致错误到AS位置^^
  • @AndrewB,遗憾的是没有。我一排都试过了。结果相同:(
  • SQL 区分大小写对吧?您似乎使用“EAN”和“ean”作为表名和列名,在第一个 FROM 部分中,您从“EAN”中选择,在连接中您从“ean”中选择。如果它们是不同的表,对于“GROUP BY ean”,ean 是不是您要从中选择的表名而不是要分组的列?
  • @AndrewB:不。 (标准)SQL 不区分大小写。 EAN、Ean 和 ean 都是相同的标识符。
  • 经过低谷测试,与 CS 无关。但好主意:)

标签: sql sqlbase sqltalk


【解决方案1】:

我认为 SQLBase 7.01 不支持正确的 ANSI JOIN 语法(除此之外:使用更现代的产品是多么好的理由)。该错误表明INNER JOIN 存在问题。

这里有两种可能的解决方案。

首先,令人讨厌的古老 join 语法:

SELECT *
FROM EAN E,
     ( SELECT EAN, COUNT(*) as cnt FROM ean GROUP BY ean HAVING COUNT(*) > 1 )  
R 
WHERE E.EAN = R.EAN;

第二,IN:

SELECT *
FROM EAN E
WHERE E.EAN IN ( SELECT EAN FROM ean GROUP BY ean HAVING COUNT(*) > 1 )  

【讨论】:

  • 有些人似乎不是从这个世界知道所有这些东西的:D 第一个不起作用,但第二个起作用。这个选择需要很多时间,但实际上是我想要的结果。谢谢你:)
  • 顺便说一句,我知道我们应该使用更新的数据库,但在这种情况下,很遗憾这是不可能的。实际上它是一个正在运行的系统,构建这个新系统需要花费很多时间:)
【解决方案2】:

试试这个(用AS关键字给表添加别名)

SELECT * FROM EAN AS E 
INNER JOIN 
(SELECT EAN, COUNT(*) FROM ean GROUP BY ean HAVING COUNT(*) > 1) AS R 
ON 
E.EAN = R.EAN;

【讨论】:

  • 使用 AS 会导致同样的错误,但是光标会跳转到 AS 的位置而不是内连接。我猜在这种情况下不能使用 AS。
  • 您使用的是哪个数据库?
  • 如果您只是放弃AS 但其他所有内容都与@AishvaryaKarthik 的答案相同,会发生什么情况?
  • 正如我在帖子中评论的那样:Gupta Centura SQLBase 7.0.1
  • 我知道这已经得到解答,但如果您需要了解更多关于 SQLBase 的信息,这里有一个链接,指向从 v8 到 v12.1 的每个版本的一些手册:samples.tdcommunity.net/index.php?dir=SqlBase/SqlBase_Books
【解决方案3】:
SELECT * 
FROM EAN E 
INNER JOIN 
    (SELECT EA.EAN, COUNT(*) Cnt 
    FROM ean EA
    GROUP BY EA.ean 
    HAVING COUNT(*) > 1 
    ) R ON E.EAN = R.EAN;

我给 COUNT(*) 起了一个别名 Cnt。这应该会使错误消失。

【讨论】:

  • 再试一次。我在子查询中给表 ean 起了一个别名。
  • 对不起,没有。跳出'INNER'
猜你喜欢
  • 2012-09-29
  • 2016-01-08
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
相关资源
最近更新 更多