You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by "Lukas Eder (JIRA)" <ji...@apache.org> on 2018/02/26 11:55:00 UTC

[jira] [Created] (DERBY-6984) Cannot use UNION in correlated subquery or derived table when first UNION subquery is parenthesised

Lukas Eder created DERBY-6984:
---------------------------------

             Summary: Cannot use UNION in correlated subquery or derived table when first UNION subquery is parenthesised
                 Key: DERBY-6984
                 URL: https://issues.apache.org/jira/browse/DERBY-6984
             Project: Derby
          Issue Type: Improvement
          Components: SQL
    Affects Versions: 10.14.1.0
            Reporter: Lukas Eder


This is a correct SQL query in Derby:

 
{code:java}
(
  SELECT tablename
  FROM sys.systables
  ORDER BY tablename
  FETCH FIRST ROW ONLY
)
UNION ALL
(
  SELECT tablename
  FROM sys.systables
  ORDER BY tablename DESC
  FETCH FIRST ROW ONLY
){code}
Now, if I want to put this query in a derived table or correlated subquery, it doesn't work. The expectedly correct syntax should be:

 

 
{code:java}
SELECT *
FROM (
  (
    SELECT tablename
    FROM sys.systables
    ORDER BY tablename
    FETCH FIRST ROW ONLY
  )
  UNION ALL
  (
    SELECT tablename
    FROM sys.systables
    ORDER BY tablename DESC
    FETCH FIRST ROW ONLY
  )
) t{code}
The error I'm getting is

 
{code:java}
Syntax error: Encountered "UNION" at line 10, column 3.{code}
 

 

In this case, I cannot remove the parentheses around the first union subquery because of the ORDER BY / FETCH clauses. These are workarounds:

*Wrapping the first subquery in a derived table:*
{code:java}
SELECT *
FROM (
  SELECT tablename
  FROM (
    SELECT tablename
    FROM sys.systables
    ORDER BY tablename
    FETCH FIRST ROW ONLY
  ) t
  UNION ALL
  (
    SELECT tablename
    FROM sys.systables
    ORDER BY tablename DESC
    FETCH FIRST ROW ONLY
  )
) t{code}
*Prepending a dummy union subquery:*
{code:java}
SELECT *
FROM (
  SELECT '' tablename
  FROM sysibm.sysdummy1
  WHERE 1 = 0
  UNION ALL
  (
    SELECT tablename
    FROM sys.systables
    ORDER BY tablename
    FETCH FIRST ROW ONLY
  )
  UNION ALL
  (
    SELECT tablename
    FROM sys.systables
    ORDER BY tablename DESC
    FETCH FIRST ROW ONLY
  )
) t{code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)