在德尔福的where子句中未知列'而不是MySQL的

问题描述 投票:2回答:4

我正要准备撕裂了我的头发,并采取了船尾甩作为一种活!

我有一个运行良好MySQL中的MySQL查询

SELECT 
    p.ID AS DataID, 
    p.timestamp AS Timestamp, 
    sum(p.Value * v.Factor) AS Value,
    v.VirtualProfiles_id AS VProfileID 
FROM 
    profiledata p 
JOIN 
    profilevirtualjoin v 
ON 
    p.Profile_ID=v.Profile_ID 
WHERE 
    v.VirtualProfiles_id = 5
GROUP BY 
    v.Profile_ID, 
    p.timestamp 

但是,当我尝试运行这是在Delphi中SQLDataSet查询

SQLDataSet2.Active := False;
SQLDataSet2.CommandText := 'SELECT p.ID AS DataID, p.timestamp AS Timestamp, sum(p.Value * v.Factor) AS Value,' +
   'v.VirtualProfiles_id AS VProfileID FROM profiledata p JOIN profilevirtualjoin v ON ' +
   'p.Profile_ID=v.Profile_ID WHERE v.VirtualProfiles_id = ' + InttoStr(5)
   +' GROUP BY v.Profile_ID, p.timestamp';
SQLDataSet2.Active := True;

我得到一个错误

First chance exception at $765BC41F. Exception class TDBXError with message 'Unknown column 'v.VirtualProfiles_id' in 'where clause''. Process EMVS.exe (7556)

如果任何人都可以提供任何见解,我将非常感激。

编辑:

我使用的MySQL服务器5.5和Delphi XE

我所试图做的是这样的:

我有一个表,如下所示:

Profile:
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| ID          | int(11)      | NO   | PRI | NULL    | auto_increment |
| Designation | varchar(255) | YES  |     | NULL    |                |
| Description | text         | YES  |     | NULL    |                |
| UnitID      | int(11)      | NO   | PRI | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

profiledata
+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| ID         | int(11)  | NO   | PRI | NULL    | auto_increment |
| TimeStamp  | datetime | YES  |     | NULL    |                |
| Value      | double   | YES  |     | NULL    |                |
| Profile_ID | int(11)  | NO   | PRI | NULL    |                |
+------------+----------+------+-----+---------+----------------+

Virtualprofiles
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| Designation | varchar(45)  | NO   |     | NULL    |                |
| Description | varchar(255) | YES  |     | NULL    |                |
| Unit_ID     | int(11)      | NO   | PRI | 0       |                |
+-------------+--------------+------+-----+---------+----------------+

profilevirtualjoin
+--------------------+---------+------+-----+---------+----------------+
| Field              | Type    | Null | Key | Default | Extra          |
+--------------------+---------+------+-----+---------+----------------+
| id                 | int(11) | NO   | PRI | NULL    | auto_increment |
| VirtualProfiles_id | int(11) | NO   | PRI | NULL    |                |
| Profile_ID         | int(11) | NO   | PRI | NULL    |                |
| Factor             | double  | NO   |     | 1       |                |
+--------------------+---------+------+-----+---------+----------------+

我需要做的是“生产”新的配置文件是一组的现有配置文件的总和。所以,这里的简档ID被包括在virtualprofile和时间戳值相等从profiledata表中的数据必须被求和。

mysql delphi delphi-xe dbexpress dbx
4个回答
4
投票

问题

那么,问题是这样的。配备德尔福XE只能处理动态SQL查询,而不是MySQL的查询的dbExpress驱动程序。尽管动态SQL与MySQL兼容,这是不兼容的其他方式。

从MySQL手册(秒12.16.3)报价:

在标准的SQL,包括GROUP BY子句的查询不能引用非聚合列在未在GROUP BY子句中命名的选择列表。

MySQL的扩展使用GROUP BY的,这样的选择列表可参考在GROUP BY子句中未命名的非聚合列。

包括用Delphi XE3更新dbExpress驱动程序包括对MySQL的代码的具体支持,所以此限制不适用。

解决方法

这个问题的解决方案是建立在MySQL服务器视图,并把它从德尔福只使用动态SQL兼容的代码中调用。在结束了以下解决方法奏效了:

在MySQL:

CREATE VIEW `VirtualProfileData` AS
SELECT 
    p.ID AS DataID, 
    p.timestamp AS Timestamp, 
    sum(p.Value * v.Factor) AS Value,
    v.VirtualProfiles_id AS VProfileID 
FROM 
    profiledata p 
JOIN 
    profilevirtualjoin v 
ON 
    p.Profile_ID=v.Profile_ID 
GROUP BY 
    v.Profile_ID, 
    p.timestamp

然后在Delphi

SQLDataSet2.Active := False;
SQLDataSet2.CommandText := 'SELECT * FROM VirtualProfileData WHERE VProfileID = ' + InttoStr(5);
SQLDataSet2.Active := True;

1
投票

在这里,你改变了列的名称:

v.VirtualProfiles_id AS VProfileID

在这之后,在大多数情况下(唯一的例外是那些涉及分组或聚合),您需要通过新的名称来引用列。我认为这是这里的情况。

试着改变你的WHERE子句中使用别名来代替:

WHERE v.VirtualProfiles_id = ' + InttoStr(5)

0
投票

问题是Mysql的类型和Delphi类型之间的兼容性尝试使用德尔福的基础类型


0
投票

在我的情况下更改

SELECT * FROM table_name WHERE column_name = 'VALUE';

SELECT * FROM table_name WHERE column_name LIKE 'VALUE';

解决了这个问题,并返回相同的结果。

我没有挖斗弄明白发生了什么事,但它是一个奇怪的错误,因为它工作正常与其他所有列,除了与特定的一个。

© www.soinside.com 2019 - 2024. All rights reserved.