2

髪を引きちぎり、うんち投げを生業にする準備ができました!

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       |                |
+--------------------+---------+------+-----+---------+----------------+

私がする必要があるのは、一連の既存のプロファイルの合計である新しいプロファイルを「作成」することです。したがって、profileID が virtualprofile に含まれ、タイムスタンプ値が等しい場合、profiledata テーブルのデータを合計する必要があります。

4

4 に答える 4

4

問題

だから、問題はこれです。Delphi XEで提供されるDBExpressドライバーは、動的SQLクエリのみを処理でき、MySQLクエリは処理できません。Dynamic SQLはMySQLと互換性がありますが、その逆は互換性がありません。

MySQLマニュアルからの引用(秒12.16.3):

標準SQLでは、GROUP BY句を含むクエリは、GROUPBY句で指定されていない選択リスト内の非集計列を参照できません。

MySQLはGROUPBYの使用を拡張して、選択リストがGROUPBY句で指定されていない非集計列を参照できるようにします。

Delphi XE3に含まれている更新されたDBExpressドライバーには、MySQLコードの特定のサポートが含まれているため、この制限は適用されません。

回避策

この問題の解決策は、MySQLサーバーでビューを作成し、動的SQL互換コードのみを使用してDelphiからビューを呼び出すことです。最後に、次の回避策でうまくいきました。

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;
于 2012-12-07T07:39:08.483 に答える
1

ここで列の名前を変更しました:

v.VirtualProfiles_id AS VProfileID

その後、ほとんどの場合 (グループ化または集計を伴う場合を除きます)、新しい名前で列を参照する必要があります。ここはそうだと思います。

WHERE代わりにエイリアスを使用するように句を変更してみてください。

WHERE v.VirtualProfiles_id = ' + InttoStr(5)
于 2012-12-06T12:04:45.327 に答える
0

問題は、Mysql 型と Delphi 型の互換性です Delphi の Basics 型を使用しようとします

于 2013-03-08T15:00:30.473 に答える