2016-04-27 7 views
1

Apache Derbyの(10.12.1.1)を使用して、私は次の表を作成しました:Apache Derby:列参照 'xx'が無効であるか、無効な式の一部です。

CREATE TABLE ROWCONTENT(
ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1) PRIMARY KEY, 
MD5SUM CHAR(32) UNIQUE, 
CONTENT CLOB, 
CONTIG VARCHAR(20), 
START INT, 
STOP INT, 
REF VARCHAR(50) NOT NULL 
); 

CREATE TABLE VCF(
ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1) PRIMARY KEY, 
NAME VARCHAR(255) 
); 

CREATE TABLE VCFROW(
ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1) PRIMARY KEY, 
VCF_ID INTEGER CONSTRAINT row2vcf REFERENCES VCF, 
ROW_ID INTEGER CONSTRAINT row2content REFERENCES ROWCONTENT 
); 

を私は次の文

SELECT 
VCF.ID,VCF.NAME, COUNT(VCFROW.ID) as "COUNT_VARIANTS" 
FROM 
    VCF,VCFROW,ROWCONTENT 
WHERE 
    VCFROW.VCF_ID=VCF.ID AND 
    VCFROW.ROW_ID = ROWCONTENT.ID AND 
    ROWCONTENT.CONTIG IS NOT NULL 
GROUP BY VCF.ID 

を使用してSELECTをしようとすると、私は次の例外を取得:

java.sql.SQLSyntaxErrorException: Column reference 'VCF.NAME' is invalid, or is part of an invalid expression. For a SELECT list with a GROUP BY, the columns and expressions being selected may only contain valid grouping expressions and valid aggregate expressions. 
    at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source) 
    at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source) 
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source) 
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source) 
    at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source) 
    at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source) 
    at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown Source) 
    at org.apache.derby.impl.jdbc.EmbedStatement.executeQuery(Unknown Source) 

あなたはその理由を知っていますか?おかげさまで

答えて

3

JOIN明示的に最初の使用:

... 
FROM VCF 
JOIN VCFROW 
    ON VCFROW.VCF_ID=VCF.ID 
JOIN ROWCONTENT 
    ON VCFROW.ROW_ID = ROWCONTENT.ID 
WHERE ROWCONTENT.CONTIG IS NOT NULL 
GROUP BY VCF.ID; 

あなたが全体のテーブル名を記述する必要はありませんので、あなたはまた、表の別名を追加することができます。


第二VCF.NAMEGROUP BYの一部ではなく、それが集計関数でラップされていません。ニーズに応じて

を使用します。

GROUP BY VCF.ID,VCF.NAME 
-- or 
SELECT VCF.ID, MAX(VCF.NAME) AS NAME, COUNT(VCFROW.ID) AS COUNT_VARIANTS 

関連:標準SQLではGroup by clause in mySQL and postgreSQL, why the error in postgreSQL?

、GROUP BY句を含むクエリではありません選択リストに凝集していない列を参照することはできませんGROUP BY句で指定されています

関連する問題