2016-04-27 8 views
1

mit Apache Derby (10.12.1.1), habe ich die folgenden Tabellen:Apache Derby: Spaltenreferenz 'xx' ist ungültig oder Teil eines ungültigen Ausdrucks.

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 
); 

aber wenn ich versuche, eine SELECT die folgende Anweisung

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 

ich mit bekommen die folgende Ausnahme:

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) 

Wissen Sie warum? Danke.

Antwort

3

Erster Einsatz explizite 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; 

Sie auch Aliase Tabelle hinzufügen könnte, damit Sie nicht ganze Tabellennamen zu schreiben.


Zweite VCF.NAME ist nicht Teil der GROUP BY und es ist nicht mit Aggregationsfunktion gewickelt.

je nach Bedarf verwenden:

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

Verwandte: Group by clause in mySQL and postgreSQL, why the error in postgreSQL?

in Standard-SQL eine Abfrage, die ein GROUP BY-Klausel enthält keine nicht aggregierten Spalten in der Auswahlliste verweisen, die nicht in der GROUP BY-Klausel

benannt