【问题标题】:SQL column unknown on firebird databasefirebird 数据库上的 SQL 列未知
【发布时间】:2017-11-26 18:40:43
【问题描述】:

我开始说我是数据库、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 到 angclientifornitori.codclifor)

表中ANGCLIENTIFORNITORI

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

表中ANGUTENTI

  • IDUTENTE(整数 PK)
  • 名词名词 (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 表你有used only in your INNER SELECT 查询。因此它在这一行不可见- ON ANGUTENTI.IDUTENTE = PRODUZIONE_T.RESPONSABILEUC
  • 您可以添加表结构和一些您试图通过此查询获取的内容的描述。您可能会得到更好的解决方案。
  • 感谢我更新了帖子

标签: sql firebird


【解决方案1】:

在来自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

【讨论】:

    猜你喜欢
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多