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
我们有:
- CODPRODUZIONE(整数 PK)
- CODORDINE(整数 FK 到 ORDINI_T.CODORDINE)
- NUMEROCOMMESSA (varchar)
- DATACONSEGNA(时间戳)
- RESPONSABILEUC(整数)
在TableORDINI_T
- CODORDINE(整数 PK)
- CODCLIFOR(varchar(25) FK 到 angclientifornitori.codclifor)
在TableANGCLIENTIFORNITORI
- CODCLIFOR (varchar(25) PK)
- RAGIONESOCIALE1 (varchar)
在tableANGUTENTI
- IDUTENTE(整数 PK)
- NOMINATIVO (varchar(40)
对于每条记录,我必须在 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
。
我开始说我是数据库的新手,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
我们有:
- CODPRODUZIONE(整数 PK)
- CODORDINE(整数 FK 到 ORDINI_T.CODORDINE)
- NUMEROCOMMESSA (varchar)
- DATACONSEGNA(时间戳)
- RESPONSABILEUC(整数)
在TableORDINI_T
- CODORDINE(整数 PK)
- CODCLIFOR(varchar(25) FK 到 angclientifornitori.codclifor)
在TableANGCLIENTIFORNITORI
- CODCLIFOR (varchar(25) PK)
- RAGIONESOCIALE1 (varchar)
在tableANGUTENTI
- IDUTENTE(整数 PK)
- NOMINATIVO (varchar(40)
对于每条记录,我必须在 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
。