【问题标题】:Multiple INNER JOINS in Access db from delphi来自delphi的Access db中的多个INNER JOINS
【发布时间】:2016-10-02 03:19:45
【问题描述】:

我编写了最简单的程序,连接到 accessessdb 并从 Memo 列执行 SQL 查询。

查询示例:

SELECT 
    company_name, date_of_order_start, date_of_order_finish
FROM 
    customers
INNER JOIN 
    orders ON customers.id_customer = orders.id_customer
WHERE 
    company_name='Ампер';

它工作正常,但是这个查询

SELECT 
    company_name, date_of_order_start, date_of_order_finish, amount
FROM 
    customers
INNER JOIN 
    orders ON customers.id_customer = orders.id_customer
INNER JOIN 
    invoice ON invoice.id_order = orders.id_order
WHERE 
    company_name='Ампер';

返回语法错误

表达式“customers.id_customer=orders.id_customer”中缺少运算符 INNER JOIN invoice ON invoice.id_order=orders.id_orde' 。

是的,.id_order 中的最后一个 r 没有显示。

请帮忙,我哪里出错了。

程序代码下方

    unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.StdCtrls, Vcl.DBCtrls,
  Vcl.Grids, Vcl.DBGrids, Vcl.ExtCtrls, Data.Win.ADODB;

type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    DataSource1: TDataSource;
    ADOQuery1: TADOQuery;
    Panel1: TPanel;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Memo1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
//проверим - есть ли текст в Memo. Если нет, выходим:
  if Memo1.Text = '' then begin
    ShowMessage('Вначале введите запрос!');
    Memo1.SetFocus;
    Exit;
  end;
  //текст есть. Очистим предыдущий запрос в наборе данных:
  ADOQuery1.SQL.Clear;
  //добавим новый запрос из Memo:
  ADOQuery1.SQL.Add(Memo1.Text);
  //открываем набор данных, т.е. выполняем запрос:
ADOQuery1.Open;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo1.Clear;
end;

procedure TForm1.Memo1Change(Sender: TObject);
begin
  ADOQuery1.SQL.Add(Memo1.Text);
  ADOQuery1.SQL := Memo1.Lines;
end;


end.

【问题讨论】:

  • 好像查询的文本被截断了。我建议调试 Delphi 应用程序并检查文本变量中存储的值
  • 请显示您从备忘录控件中检索 SQL 文本并将其放入 ADOQuery.SQL 的代码。我还建议您为所有表和列设置别名,如 SELECT c.company_name, o.date_of_order_start, o.date_of_order_finish FROM customers c INNER JOIN orders o ON c.id_customer = o.id_customer,以避免与列名发生任何意外冲突(并减少输入)。
  • 我在正文中添加了代码。谢谢你帮助我
  • 您在 Memo1Change 中对 ADOQuery1.SQL 的分配似乎有冲突,但我认为您不需要其中任何一个。

标签: sql delphi syntax


【解决方案1】:

更多信息:这里将Memo1.Text 两次写入ADOQuery1.SQL

procedure TForm1.Memo1Change(Sender: TObject);
begin
  ADOQuery1.SQL.Add(Memo1.Text);       // <-- first time
  ADOQuery1.SQL := Memo1.Lines;        // <-- 2nd time
end;

您在此处将语句写入 ADOQuery1:

 //текст есть. Очистим предыдущий запрос в наборе данных:
  ADOQuery1.SQL.Clear;
  //добавим новый запрос из Memo:
  ADOQuery1.SQL.Add(Memo1.Text);

【讨论】:

    【解决方案2】:

    非常感谢所有试图帮助我的人!

    in access db JOIN 必须在 (),所以这个查询可以正常工作:

     SELECT 
    company_name, date_of_order_start, date_of_order_finish, amount
        FROM 
    (customers
        INNER JOIN orders ON customers.id_customer=orders.id_customer)
        INNER JOIN invoice ON invoice.id_order=orders.id_order
        WHERE company_name='Ампер';
    

    【讨论】:

    • 正确的问题名称非常重要。请用更准确的问题描述重命名您的问题。这是您的名字不好的问题的答案:stackoverflow.com/questions/20929332/…
    • 你是对的,但是当我写问题时,我不明白问题出在哪里。
    • 当然可以,但现在让我们为其他人做点有用的事情:)
    【解决方案3】:

    我建议在您的查询周围添加错误处理:

    Try
      ....
      // setup and execute your query
    
        except on e: exception do
          begin
            LogMyErrorSomehow(format('ERROR: [%s-%s] SQL:[%s]',
               [e.ClassType.ClassName, e.Message, ADOQuery1.SQL.text]));
          end;
        end;
    end;
    

    【讨论】:

    • 这并不能解决IP面临的问题——它只是提供了更恰当地报告错误的能力。
    • 我认为实际的问题是 OP 没有基本的调试/故障排除技能,所以是的,这确实有助于解决他的问题。
    • 是的,你是对的)我没有)实际上我是初学者 Web 开发人员,这项任务是为我的大学工作完成的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2014-01-22
    相关资源
    最近更新 更多