我开始说我是数据库,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
中,我们有:
在表ORDINI_T
在表ANGCLIENTIFORNITORI
在表ANGUTENTI
对于每条记录,我必须使用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
答案 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
。