【问题标题】:'No such Column' error when using SELECT on a view在视图上使用 SELECT 时出现“没有这样的列”错误
【发布时间】:2016-06-15 06:38:06
【问题描述】:
CREATE VIEW [0_NumOfCode] AS
    SELECT tbDeviceId.deviceId,
           count(DISTINCT tbCodeList_AV.codeNum) AS NumCode
      FROM tbDeviceId
           INNER JOIN
           tbCodeList_AV ON tbDeviceId.deviceId = tbCodeList_AV.deviceId
     GROUP BY tbDeviceId.deviceID
    UNION
    SELECT tbDeviceId.deviceID,
           count(DISTINCT tbCodelist_AC.codeNum) 
      FROM tbDeviceId
           INNER JOIN
           tbCodelist_AC ON tbDeviceId.deviceId = tbCodelist_AC.deviceId
     GROUP BY tbDeviceId.DeviceID;

上下文:我实际上正在创建一个使用 SQLite 并接受 .db 文件输入的 C++ 程序,所以我在这里给出的这个 SQL 代码(来自 db 文件)不是我的,我不知道'认为我不应该(或应该)改变它,但我面临一个令人困惑的问题,这就是我问这个问题的原因。

基本上,现在我想选择这个 0_NumOfCode 视图的 deviceId 列,但我该怎么做呢? 都没有

SELECT tbDeviceId.deviceId FROM [0_NumOfCode]

也没有

SELECT deviceId FROM [0_NumofCode]

也没有

SELECT [0_NumOfCode].deviceId FROM [0_NumOfCode]

完成了这项工作(“没有这样的列”错误)。但是,当我选择 * 时,列和数据确实显示在 tbDeviceId.deviceID 下

现在,我认为列的别名可能会解决问题,但就像我说的,我认为我不应该更改 SQL 代码。所以

1) 给定这段 SQL 代码,我该怎么做?

2) (出于我自己的好奇心)一个别名也可以解决它,对吧?

更新:我最初的问题已经解决(在 cmets 中),尽管我仍然对它的工作原理有点迷茫(' vs ` vs no quotes)。

另外,我面临的一个新问题:

SELECT tbdeviceid.DeviceID,
       numcode,
       numbrand,
       devicename15,
       devicename30,
       comment,
       devicenameCN
  FROM tbdeviceid
       INNER JOIN
       [0_NumofBrand] ON tbdeviceid.deviceId = [0_NumofBrand].deviceId
       INNER JOIN
       [0_numofcode] ON tbdeviceid.deviceId = [0_numofcode].deviceId

最后一行给出没有这样的列错误。如何表示列?

【问题讨论】:

  • 也许 SELECT `tbDeviceId.deviceId` FROM [0_NumOfCode] ?
  • 另外一个别名也可以解决,用select NumCode from 0_NumOfCode测试一下
  • “DeviceId”列可能不再包含表 tbDeviceId。通过“select * from tbDeviceId”进行验证。
  • 成功了!非常感谢@amow :D (顺便说一句,我第一次尝试使用 ' 而不是 ` 但没有用,它们之间有什么区别?)
  • 另外,是的,别名也可以解决,我测试过。

标签: c++ sql sqlite


【解决方案1】:

我想这会起作用..
使用别名修改您的视图。

SELECT tbDeviceId.deviceId as dId, ...

然后使用该别名使用 select 语句

Select dId from [0_NumOfCode]

【讨论】:

  • 确实,别名确实可以解决,但就像我在问题中所说的,SQL 代码不是我的,我更喜欢没有修改它的解决方案
  • 我的想法是:然后您应该从视图中将(全部)插入临时表,然后从临时表中删除“NumCode”列。然后你可以使用Select * from temp
  • 我想这会奏效,但是(在我看来)这太长了,特别是与@amow 在 cmets 中给我的解决方案相比。我的问题已经解决了,但是由于他是评论,所以上面没有接受按钮。不过我问了一个后续问题,也许你能解释一下?
猜你喜欢
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
相关资源
最近更新 更多