firebird数据库

时间:2017-06-23 08:51:08

标签: sql firebird

我开始说我是数据库,sql和类似的新手,所以可能代码语法错了......

我必须从firebird数据库的三个表中提取一些数据。

我尝试了这个查询:

SELECT 
    PRODUZIONE_T.NUMEROCOMMESSA,
    ANGCLIENTIFORNITORI.RAGIONESOCIALE1,
    PRODUZIONE_T.DATACONSEGNA,
    ANGUTENTI.NOMINATIVO 
FROM 
        (SELECT 
            PRODUZIONE_T.NUMEROCOMMESSA, 
            ANGCLIENTIFORNITORI.RAGIONESOCIALE1, 
            PRODUZIONE_T.DATACONSEGNA 
        FROM PRODUZIONE_T 
            LEFT OUTER JOIN 
            ORDINI_T ON 
            PRODUZIONE_T.CODORDINE=ORDINI_T.CODORDINE 
            INNER JOIN ANGCLIENTIFORNITORI ON 
            ANGCLIENTIFORNITORI.CODCLIFOR=ORDINI_T.CODCLIFOR) 
    INNER JOIN 
        (SELECT ANGUTENTI.NOMINATIVO
         FROM ANGUTENTI)
    ON ANGUTENTI.IDUTENTE = PRODUZIONE_T.RESPONSABILEUC 
    ORDER BY PRODUZIONE_T.NUMEROCOMMESSA;

但是我收到了这个错误:

  

错误:GDS异常。 335544569.动态SQL错误SQL错误代码=   -206列未知ANGUTENTI.IDUTENTE在第20行第15栏错误代码:335544569

我确定字段ANGUTENTI.IDUTENTE存在!

为什么呢?有什么建议吗?

数据库不是我的创造。 我必须提取一些数据并将其导入excel:这个表:

在表格PRODUZIONE_T中,我们有:

  • CODPRODUZIONE(整数PK)
  • CODORDINE(整数FK到ORDINI_T.CODORDINE)
  • NUMEROCOMMESSA(varchar)
  • DATACONSEGNA(时间戳)
  • RESPONSABILEUC(整数)

在表ORDINI_T

  • CODORDINE(整数PK)
  • CODCLIFOR(varchar(25)FK to angclientifornitori.codclifor)

在表ANGCLIENTIFORNITORI

  • CODCLIFOR(varchar(25)PK)
  • RAGIONESOCIALE1(varchar)

在表ANGUTENTI

  • IDUTENTE(整数PK)
  • NOMINATIVO(varchar(40)

对于每条记录,我必须使用PRODUZIONE_T.NUMEROCOMMESSA, ANGCLIENTIFORNITORI.RAGIONESOCIALE1, PRODUZIONE_T.DATACONSEGNA, ANGUTENTI.NOMINATIVO在Excel中写一行。

numerocommessa是数字订单,ragionesociale1是客户名称,Dataconsegna是日期,Nominativo是商业代理商的名称。

这是VBA代码

Public Sub UpCommesse()
Application.EnableEvents = False
Set Conn = New ADODB.Connection
Driver = "Firebird/InterBase(r) driver"
Host = "Zamberlangest"
Utente = "SYSDBA"
Password = "masterkey"
Database = "Commesse"
'Stringa = "DRIVER=Firebird/InterBase(r) driver;=zamberlangest;UID=SYSDBA;PWD=masterkey;DBNAME=c:\program files\go2\database\go2.gdb"
Stringa = "DRIVER=Firebird/InterBase(r) driver;User=SYSDBA;Password=masterkey;Database=\\zamberlangest/c:\program files\go2\database\go2.gdb;DataSource=zamberlangest;Port=3050;Dialect=3;Charset=NONE;Role=;Connection lifetime=15;Pooling=true;MinPoolSize=0;MaxPoolSize=50;Packet Size=8192;ServerType=0;"

Conn.ConnectionString = Stringa
'On Error GoTo Connect_Error
If Not (Conn.State = adStateOpen) Then
    Conn.Properties("PROMPT") = adPromptNever
    Conn.Open
    Connesso = True
End If
Application.EnableEvents = True
Call Commesse
Exit Sub
Connect_Error:
    MsgBox "Connessione con il server MySQL " & Host & " fallita", vbCritical, "Attenzione"
    Connesso = False
    End
On Error GoTo 0

End Sub
Sub Commesse()
Set FoglioCommessa = ThisWorkbook.Sheets("commesse")
FoglioCommessa.Cells.Delete
Application.EnableEvents = True
Set RS1 = New ADODB.Recordset
'Query = "SELECT PRODUZIONE_T.NUMEROCOMMESSA, ANGCLIENTIFORNITORI.RAGIONESOCIALE1, PRODUZIONE_T.DATACONSEGNA FROM PRODUZIONE_T LEFT OUTER JOIN ORDINI_T ON PRODUZIONE_T.CODORDINE=ORDINI_T.CODORDINE INNER JOIN ANGCLIENTIFORNITORI ON ANGCLIENTIFORNITORI.CODCLIFOR=ORDINI_T.CODCLIFOR;"
Query = "SELECT PRODUZIONE_T.NUMEROCOMMESSA, ANGCLIENTIFORNITORI.RAGIONESOCIALE1, PRODUZIONE_T.DATACONSEGNA, ANGUTENTI.NOMINATIVO FROM (SELECT PRODUZIONE_T.NUMEROCOMMESSA, ANGCLIENTIFORNITORI.RAGIONESOCIALE1, PRODUZIONE_T.DATACONSEGNA FROM PRODUZIONE_T LEFT OUTER JOIN ORDINI_T ON PRODUZIONE_T.CODORDINE=ORDINI_T.CODORDINE INNER JOIN ANGCLIENTIFORNITORI ON ANGCLIENTIFORNITORI.CODCLIFOR=ORDINI_T.CODCLIFOR) INNER JOIN (SELECT ANGUTENTI.NOMINATIVO FROM ANGUTENTI) ON PRODUZIONE_T.RESPONSABILEUC = ANGUTENTI.IDUTENTE ORDER BY PRODUZIONE_T.NUMEROCOMMESSA;"
With RS1
    .ActiveConnection = Conn
    .Source = Query
    .Open
    FoglioCommessa.Range("a1").CopyFromRecordset RS1
    .Close
End With
Conn.Close
End Sub

1 个答案:

答案 0 :(得分:3)

ANGUTENTI的子查询中,您不包含列IDUTENTE,因此Firebird无法执行连接。您应该将子查询视为仅包含所选内容的虚拟表,因此您需要在选择列表中显式指定该列。

您还需要在子查询中添加别名才能使用它,否则您只会拥有一个无名的'虚拟表,因此无法引用。

但是,您的子查询不是必需的,您也可以只引用表格

使用:

FROM PRODUZIONE_T 
LEFT OUTER JOIN ORDINI_T 
    ON PRODUZIONE_T.CODORDINE=ORDINI_T.CODORDINE 
INNER JOIN ANGCLIENTIFORNITORI 
    ON ANGCLIENTIFORNITORI.CODCLIFOR=ORDINI_T.CODCLIFOR 
INNER JOIN ANGUTENTI
    ON ANGUTENTI.IDUTENTE = PRODUZIONE_T.RESPONSABILEUC 

请注意,ORDINI_T上的左连接会隐式转换为内连接,因为您在后续内连接中使用ORDINI_T中的列到ANGCLIENTIFORNITORI