0

我有以下 SQL statmenet

SELECT   COUNT('Oprettet af Initialer') AS meetings_booked,
         Dato salgstrin,
         VTEAM.TEAM
FROM     KS_DRIFT.DIAN_POT_OPR POT 
         RIGHT JOIN KS_DRIFT.V_TEAM_DATO VTEAM ON VTEAM.DATO = POT.'Dato salgstrin'
WHERE    exists (SELECT 1 FROM KS_DRIFT.V_TEAM_DATO WHERE KS_DRIFT.DIAN_POT_OPR.'Oprettet af Initialer' = KS_DRIFT.V_TEAM_DATO.INITIALER)
AND      'Salgstri' NOT IN('01 - Muligt emne','02 - Aktivt emne')
AND      'Oprettet dato' BETWEEN '2013-09-04' AND '2013-09-04'
GROUP BY 'Dato salgstrin' 'Oprettet af Initialer', VTEAM.TEAM
ORDER BY 'Dato salgstrin'

现在,每当我尝试运行它时,都会出现以下错误:

Invalid user.table.column, table.colum, or column specification

有谁知道为什么会发生这种情况以及我该如何解决?

桌子的图像

KS_DRIFT.DIAN_POT_OPR:

表格1

KS_DRIFT.VTEAM_DATO:

在此处输入图像描述

4

2 回答 2

4

列(和表)名称需要用双引号括起来,而不是单引号。单引号用于字符串文字(“值”)。

'Oprettet af Initialer'是一个字符串,"Oprettet af Initialer"是一个列名

所以你可能想要:

SELECT   COUNT("Oprettet af Initialer") AS meetings_booked,
         "Dato salgstrin",
         VTEAM.TEAM
FROM     KS_DRIFT.DIAN_POT_OPR POT 
         RIGHT JOIN KS_DRIFT.V_TEAM_DATO VTEAM ON VTEAM.DATO = POT."Dato salgstrin"
WHERE    exists (SELECT 1 FROM KS_DRIFT.V_TEAM_DATO WHERE KS_DRIFT.DIAN_POT_OPR."Oprettet af Initialer" = KS_DRIFT.V_TEAM_DATO.INITIALER)
AND      "Salgstri" NOT IN ('01 - Muligt emne','02 - Aktivt emne')
AND      "Oprettet dato" BETWEEN '2013-09-04' AND '2013-09-04'
GROUP BY "Dato salgstrin", "Oprettet af Initialer", VTEAM.TEAM
ORDER BY "Dato salgstrin"

有关详细信息,请参阅手册:http: //docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements008.htm#i27561

编辑

您的子选择有另一个错误:

KS_DRIFT.DIAN_POT_OPR."Oprettet af Initialer"并且KS_DRIFT.V_TEAM_DATO.INITIALER是无效的列引用。里面有一个元素太多了。列引用始终采用tableName.columnName或形式tableAlias.ColumnName。他们从来没有三个元素。我不确定在你的情况下哪一个是不正确的。

编辑 2

在 GROUP BY 子句中列出“Oprettet af Initialer”似乎有点奇怪,因为您将该列也用作聚合函数的一部分(在计数内)。


关于您的 DATE 值的旁注:指定这样的日期'2013-09-04'会受到隐含数据类型转换的影响,这是否有效取决于您正在使用的客户端软件的 NLS 设置 - 在我的计算机上,该格式会产生错误。

使用以下方法明确说明日期的格式要好得多to_date()

to_date('2013-09-04', 'YYYY-MM-DD')

或者,如果您想少输入一点,您可以使用 ANSI 日期文字,该日期文字通过使用DATE ISO 格式字符串文字前面的关键字指定:

DATE '2013-09-04'
于 2013-09-05T13:16:26.560 回答
0

您正在使用'用于标记字符串的单引号,而不是"使用当列/表名称包含空格或保留名称(如USERor )时使用的双引号INDEX。没有KS_DRIFT从表名中删除,但你应该有TableName.ColumnNameformat 而不是xxx.TableName.ColumnName.

此查询应该有效(但您必须修复该KS_DRIFT部分):

SELECT   COUNT(POT."Oprettet af Initialer") AS meetings_booked,
         POT."Dato salgstrin",
         VTEAM.TEAM
FROM     KS_DRIFT.DIAN_POT_OPR POT 
         RIGHT JOIN KS_DRIFT.V_TEAM_DATO VTEAM ON VTEAM.DATO = POT."Dato salgstrin"
WHERE    exists (SELECT 1 FROM KS_DRIFT.V_TEAM_DATO WHERE KS_DRIFT.DIAN_POT_OPR."Oprettet af Initialer" = KS_DRIFT.V_TEAM_DATO.INITIALER)
AND      POT."Salgstri" NOT IN('01 - Muligt emne','02 - Aktivt emne')
AND      POT."Oprettet dato" BETWEEN '2013-09-04' AND '2013-09-04'
GROUP BY "Dato salgstrin", "Oprettet af Initialer", VTEAM.TEAM
ORDER BY "Dato salgstrin"

为避免带有空格的名称出现进一步问题,我建议您使用该_字符。

参考Oracle 数据库对象名称和限定符

注意:Oracle 不建议对数据库对象名称使用带引号的标识符。SQL*Plus 接受这些带引号的标识符,但在使用其他管理数据库对象的工具时它们可能无效。


额外:如果我没记错的话,该列"Oprettet dato"DATE类型,您应该使用该to_date()函数并使用此 WHERE 子句修改查询:

AND "Oprettet dato" BETWEEN to_date('2013-09-04','YYYY-MM-DD') AND to_date('2013-09-04','YYYY-MM-DD')
于 2013-09-05T13:18:31.263 回答