FAILED: SemanticException Line 0:-1 Unsupported SubQuery Expression yyyy-MMM-dd: Only SubQuery expressions that are top level conjuncts are allowed
FAILED: SemanticException Line 0:-1 Unsupported SubQuery Expression yyyy-MMM-dd: Only SubQuery expressions that are top level conjuncts are allowed
我正在尝试在 Hive 中执行以下查询。
SELECT
B.ALTACCT
, C.DESCR
, B.JRNL_LN_REF
, B.LINE_DESCR
, CASE
WHEN B.MONETARY_AMOUNT >0
THEN B.MONETARY_AMOUNT
ELSE B.MONETARY_AMOUNT * (-1)
END
, CASE
WHEN B.MONETARY_AMOUNT > 0 THEN '+1'
ELSE '-1'
END
, B.FOREIGN_AMOUNT
, B.FOREIGN_CURRENCY
, B.JOURNAL_LINE
FROM
TABLE1 B
, TABLE2 C
WHERE
B.LEDGER = 'ACT_LOC'
AND C.ALTACCT = B.ALTACCT
AND C.EFFDT =
(
SELECT
MAX(C_ED.EFFDT)
FROM
TABLE3 C_ED
WHERE
C.SETID = C_ED.SETID
AND C.ALTACCT = C_ED.ALTACCT
AND UNIX_TIMESTAMP(C_ED.EFFDT, 'yyyy-MMM-dd') <= UNIX_TIMESTAMP('2021-JUL-08', 'yyyy-MMM-dd')
)
AND C.SETID = 'FRSHR'
AND B.ALTACCT NOT IN ('1','2','3')
union
SELECT
G.ALTACCT
, H.DESCR
, G.JRNL_LN_REF
, G.LINE_DESCR
, CASE
WHEN G.MONETARY_AMOUNT >0
THEN G.MONETARY_AMOUNT
ELSE G.MONETARY_AMOUNT *(-1)
END
, CASE
WHEN G.MONETARY_AMOUNT >0 THEN '+1'
ELSE '-1'
END
, ' '
, ' '
, G.FOREIGN_AMOUNT
, G.FOREIGN_CURRENCY
, G.JOURNAL_LINE
FROM
TABLE1 G
, TABLE2 H
WHERE
H.ALTACCT = G.ALTACCT
AND H.EFFDT =
(
SELECT
MAX(H_ED.EFFDT)
FROM
TABLE3 H_ED
WHERE
H.SETID = H_ED.SETID
AND H.ALTACCT = H_ED.ALTACCT
AND UNIX_TIMESTAMP(H_ED.EFFDT, 'yyyy-MMM-dd') <= UNIX_TIMESTAMP('2021-JUL-08', 'yyyy-MMM-dd')
)
AND H.SETID = 'FRSHR'
AND G.LEDGER = 'ACT_LOC'
AND G.MONETARY_AMOUNT <> 0
AND G.ALTACCT NOT IN ('1','2','3')
获取错误为
Error while compiling statement: FAILED: SemanticException Line 0:-1
Unsupported SubQuery Expression yyyy-MMM-dd: Only SubQuery expressions
that are top level conjuncts are allowed
有人可以帮忙吗?
使用联接重写您的查询:
...
FROM TABLE1 B
INNER JOIN TABLE2 C ON C.ALTACCT = B.ALTACCT AND C.SETID = 'FRSHR'
INNER JOIN (
SELECT C_ED.SETID, C_ED.ALTACCT
MAX(C_ED.EFFDT) MAX_EFFDT
FROM TABLE3 C_ED
WHERE UNIX_TIMESTAMP(C_ED.EFFDT, 'yyyy-MMM-dd') <= UNIX_TIMESTAMP('2021-JUL-08', 'yyyy-MMM-dd')
GROUP BY C_ED.SETID, C_ED.ALTACCT
) C_ED ON C.SETID = C_ED.SETID
AND C.ALTACCT = C_ED.ALTACCT
AND C.EFFDT = C_ED.MAX_EFFDT
WHERE B.LEDGER = 'ACT_LOC'
AND B.ALTACCT NOT IN ('1','2','3')
对 UNION 中的第二个子查询执行相同的操作。
我正在尝试在 Hive 中执行以下查询。
SELECT
B.ALTACCT
, C.DESCR
, B.JRNL_LN_REF
, B.LINE_DESCR
, CASE
WHEN B.MONETARY_AMOUNT >0
THEN B.MONETARY_AMOUNT
ELSE B.MONETARY_AMOUNT * (-1)
END
, CASE
WHEN B.MONETARY_AMOUNT > 0 THEN '+1'
ELSE '-1'
END
, B.FOREIGN_AMOUNT
, B.FOREIGN_CURRENCY
, B.JOURNAL_LINE
FROM
TABLE1 B
, TABLE2 C
WHERE
B.LEDGER = 'ACT_LOC'
AND C.ALTACCT = B.ALTACCT
AND C.EFFDT =
(
SELECT
MAX(C_ED.EFFDT)
FROM
TABLE3 C_ED
WHERE
C.SETID = C_ED.SETID
AND C.ALTACCT = C_ED.ALTACCT
AND UNIX_TIMESTAMP(C_ED.EFFDT, 'yyyy-MMM-dd') <= UNIX_TIMESTAMP('2021-JUL-08', 'yyyy-MMM-dd')
)
AND C.SETID = 'FRSHR'
AND B.ALTACCT NOT IN ('1','2','3')
union
SELECT
G.ALTACCT
, H.DESCR
, G.JRNL_LN_REF
, G.LINE_DESCR
, CASE
WHEN G.MONETARY_AMOUNT >0
THEN G.MONETARY_AMOUNT
ELSE G.MONETARY_AMOUNT *(-1)
END
, CASE
WHEN G.MONETARY_AMOUNT >0 THEN '+1'
ELSE '-1'
END
, ' '
, ' '
, G.FOREIGN_AMOUNT
, G.FOREIGN_CURRENCY
, G.JOURNAL_LINE
FROM
TABLE1 G
, TABLE2 H
WHERE
H.ALTACCT = G.ALTACCT
AND H.EFFDT =
(
SELECT
MAX(H_ED.EFFDT)
FROM
TABLE3 H_ED
WHERE
H.SETID = H_ED.SETID
AND H.ALTACCT = H_ED.ALTACCT
AND UNIX_TIMESTAMP(H_ED.EFFDT, 'yyyy-MMM-dd') <= UNIX_TIMESTAMP('2021-JUL-08', 'yyyy-MMM-dd')
)
AND H.SETID = 'FRSHR'
AND G.LEDGER = 'ACT_LOC'
AND G.MONETARY_AMOUNT <> 0
AND G.ALTACCT NOT IN ('1','2','3')
获取错误为
Error while compiling statement: FAILED: SemanticException Line 0:-1 Unsupported SubQuery Expression yyyy-MMM-dd: Only SubQuery expressions that are top level conjuncts are allowed
有人可以帮忙吗?
使用联接重写您的查询:
...
FROM TABLE1 B
INNER JOIN TABLE2 C ON C.ALTACCT = B.ALTACCT AND C.SETID = 'FRSHR'
INNER JOIN (
SELECT C_ED.SETID, C_ED.ALTACCT
MAX(C_ED.EFFDT) MAX_EFFDT
FROM TABLE3 C_ED
WHERE UNIX_TIMESTAMP(C_ED.EFFDT, 'yyyy-MMM-dd') <= UNIX_TIMESTAMP('2021-JUL-08', 'yyyy-MMM-dd')
GROUP BY C_ED.SETID, C_ED.ALTACCT
) C_ED ON C.SETID = C_ED.SETID
AND C.ALTACCT = C_ED.ALTACCT
AND C.EFFDT = C_ED.MAX_EFFDT
WHERE B.LEDGER = 'ACT_LOC'
AND B.ALTACCT NOT IN ('1','2','3')
对 UNION 中的第二个子查询执行相同的操作。