SQL firebird 数据库中的列未知

SQL column unknown on firebird database

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

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

我试过这个查询:

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;

但我收到此错误:

ERROR: GDS Exception. 335544569. Dynamic SQL Error SQL error code = -206 Column unknown ANGUTENTI.IDUTENTE At line 20, column 15 Error Code: 335544569

我确定字段 ANGUTENTI.IDUTENTE 存在!

为什么?有什么建议吗?

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

在 table PRODUZIONE_T 我们有:

在TableORDINI_T

在TableANGCLIENTIFORNITORI

在tableANGUTENTI

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

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

在来自 ANGUTENTI 的子查询中,您不包含列 IDUTENTE,因此 Firebird 无法执行连接。您应该将子查询视为仅包含 selected 内容的虚拟 table,因此您需要在 select 列表中明确指定该列。

您还需要为子查询添加别名才能使用,否则您将只有一个 'nameless' 虚拟 table,因此无法引用.

但是你的子查询并不是真正必要的,你也可以只引用 tables 而不是

使用:

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