1064 error in mariadb 10.3.15 but not on mysql ver 5.5.62 - mysql-error-1064

I was hoping someone might be able to point out which part of the mysql query might be causing the syntax error.
This query was working on our previous server running mysql 5.5.62 but is now showing an error on mariadb version 10.3.15
SELECT p.product_id
,p.product_name
,p.product_thumb_image
FROM jos_vm_product AS p
WHERE p.product_sku = ' w '
AND p.product_publish = 'Y'
LIMIT 0,10
UNION
(
SELECT p.product_id
,p.product_name
,p.product_thumb_image
FROM jos_vm_product AS p
WHERE p.product_name LIKE ' w %'
AND p.product_publish = 'Y'
LIMIT 0,10
)
UNION
(
SELECT p.product_id
,p.product_name
,p.product_thumb_image
FROM jos_vm_product AS p
WHERE (p.product_name LIKE '% w %')
AND p.product_publish = 'Y'
LIMIT 0,10
)
UNION
(
SELECT p.product_id
,p.product_name
,p.product_thumb_image
FROM jos_vm_product AS p
WHERE p.product_sku LIKE 'w%'
AND p.product_publish = 'Y'
LIMIT 0,10
)
UNION
(
SELECT p.product_id
,p.product_name
,p.product_thumb_image
FROM jos_vm_product AS p
WHERE p.product_desc LIKE '% w %'
AND p.product_publish = 'Y'
LIMIT 0,10
)
UNION
(
SELECT p.product_id
,p.product_name
,p.product_thumb_image
FROM jos_vm_product AS p
WHERE p.product_s_desc LIKE '% w %'
AND p.product_publish = 'Y'
LIMIT 0,10
)
UNION
(
SELECT p.product_id
,p.product_name
,p.product_thumb_image
FROM jos_vm_product AS p
WHERE ((p.product_name LIKE '%w%'))
AND p.product_publish = 'Y'
LIMIT 0,10
)
I would hope for the query to run successfully but it outputs an error 1064 - you have an error in your SQL syntax...

You can use LIMIT only in the last subquery of a UNION. Maybe MySQL [wrongfully] allows you to run this query, but MariaDB rejects it.
Solution? Just enclose the first query in parenthesis, as in:
( -- enclosing parenthesis
SELECT p.product_id
,p.product_name
,p.product_thumb_image
FROM jos_vm_product AS p
WHERE p.product_sku = ' w '
AND p.product_publish = 'Y'
LIMIT 0,10
) -- enclosing parenthesis
UNION
(
SELECT p.product_id
,p.product_name
,p.product_thumb_image
FROM jos_vm_product AS p
WHERE p.product_name LIKE ' w %'
AND p.product_publish = 'Y'
LIMIT 0,10
)
UNION
(
SELECT p.product_id
,p.product_name
,p.product_thumb_image
FROM jos_vm_product AS p
WHERE (p.product_name LIKE '% w %')
AND p.product_publish = 'Y'
LIMIT 0,10
)
UNION
(
SELECT p.product_id
,p.product_name
,p.product_thumb_image
FROM jos_vm_product AS p
WHERE p.product_sku LIKE 'w%'
AND p.product_publish = 'Y'
LIMIT 0,10
)
UNION
(
SELECT p.product_id
,p.product_name
,p.product_thumb_image
FROM jos_vm_product AS p
WHERE p.product_desc LIKE '% w %'
AND p.product_publish = 'Y'
LIMIT 0,10
)
UNION
(
SELECT p.product_id
,p.product_name
,p.product_thumb_image
FROM jos_vm_product AS p
WHERE p.product_s_desc LIKE '% w %'
AND p.product_publish = 'Y'
LIMIT 0,10
)
UNION
(
SELECT p.product_id
,p.product_name
,p.product_thumb_image
FROM jos_vm_product AS p
WHERE ((p.product_name LIKE '%w%'))
AND p.product_publish = 'Y'
LIMIT 0,10
)
Note: Please consider that LIMIT-ing rows without ORDER-ing them may yield random filtering. Is that what you want?

Related

when i pass emplid it runs but when i pass campus_id it is taking infinite time

When I pass emplid it runs but when I pass campus_id it is taking infinite time
WITH aa
AS (
SELECT DISTINCT emplid
,strm
,catalog_nbr
,COUNT(ATTEND_PRESENT) OVER (
PARTITION BY emplid
,strm
,catalog_nbr
) AS present_days
FROM ps_SRM_ATT_2_VW
WHERE ATTEND_PRESENT = 'Y'
)
,bb
AS (
SELECT DISTINCT emplid
,strm
,catalog_nbr
,COUNT(ATTEND_PRESENT) OVER (
PARTITION BY emplid
,strm
,catalog_nbr
) AS total_days
FROM ps_SRM_ATT_2_VW
)
,cc
AS (
SELECT DISTINCT emplid
,strm
,catalog_nbr
,nvl(sum(days) OVER (
PARTITION BY emplid
,strm
,catalog_nbr
), 0) AS relax_days
FROM PS_SRM_RELAX_TBL
)
,kk
AS (
SELECT DISTINCT emplid
,strm
,days
,CATALOG_NBR
FROM ps_srm_relax_tbl
)
,hh
AS (
SELECT DISTINCT a.emplid
,b.strm
,a.campus_id
,b.CATALOG_NBR
FROM ps_personal_data a
,ps_SRM_ATT_2_VW b
WHERE a.emplid = b.emplid
ORDER BY a.emplid
)
SELECT DISTINCT AA.emplid
,gg.name_display
,GG.campus_id
,nvl(kk.days, 0) AS relax_lectures
,(
CASE
WHEN tt.ssr_component = 'LEC'
OR tt.ssr_component = 'TUT'
THEN 'Theory'
ELSE 'Practical'
END
) AS component1
,nvl(round((
(
nvl(aa.present_days, 0) + nvl((
SELECT relax_days
FROM cc
WHERE emplid = aa.emplid
AND strm = aa.strm
AND catalog_nbr = aa.catalog_nbr
), 0)
) / nvl(bb.total_days, 1)
) * 100, 2), 0) AS total
,dd.acad_career
,dd.acad_prog
,ee.acad_plan
,aa.strm
,ff.ACAD_LEVEL_BOT
,bb.total_days AS total_lecture
,aa.present_days AS Lecture_attend
,pp.subject || ' ' || pp.catalog_nbr AS SubjectCatalog
,tt.COURSE_TITLE_LONG
FROM aa
LEFT JOIN cc ON aa.emplid = cc.emplid
AND aa.strm = cc.strm
AND aa.catalog_nbr = cc.catalog_nbr
Here is the ps_personal_data gg and the campus id prompt that causing problem is associated with this
LEFT JOIN ps_personal_data gg ON AA.EMPLID = GG.EMPLID
LEFT JOIN hh ON aa.emplid = hh.emplid
AND aa.strm = hh.strm
AND aa.catalog_nbr = hh.catalog_nbr
LEFT JOIN kk ON cc.emplid = kk.emplid
AND cc.strm = kk.strm
AND cc.catalog_nbr = kk.catalog_nbr
LEFT JOIN ps_crse_offer pp ON aa.CATALOG_NBR = pp.catalog_nbr
LEFT JOIN ps_crse_catalog tt ON pp.crse_id = tt.crse_id
,bb
,PS_ACAD_PROG dd
,PS_ACAD_PLAN ee
,PS_STDNT_CAR_TERM ff
WHERE dd.effdt = (
SELECT max(effdt)
FROM ps_acad_prog
WHERE emplid = dd.emplid
)
AND dd.effseq = (
SELECT max(effseq)
FROM ps_acad_prog
WHERE emplid = dd.emplid
AND effdt = dd.effdt
)
AND ee.effdt = (
SELECT max(effdt)
FROM ps_acad_prog
WHERE emplid = ee.emplid
)
AND ee.effseq = (
SELECT max(effseq)
FROM ps_acad_prog
WHERE emplid = ee.emplid
AND effdt = ee.effdt
)
AND TT.EFFDT = (
SELECT max(effdt)
FROM ps_CRSE_CATALOG
WHERE CRSE_ID = PP.CRSE_ID
)
AND dd.emplid = aa.emplid
AND aa.emplid = hh.emplid
AND ee.emplid = aa.emplid
AND aa.emplid = ff.emplid
AND aa.emplid = ee.emplid
AND aa.emplid = bb.emplid
AND
--GG.CAMPUS_ID=HH.CAMPUS_ID AND
aa.catalog_nbr = hh.catalog_nbr
AND aa.strm = bb.strm
AND tt.eff_status = 'A'
AND aa.catalog_nbr = bb.catalog_nbr
AND aa.strm = ff.strm
AND tt.effdt = (
SELECT max(effdt)
FROM ps_crse_catalog
WHERE crse_id = pp.crse_id
)
AND AA.STRM = '1901'
AND
--AA.EMPLID='00000009724';
If I hide the gg.campus_id and pass aa.emplid it will run smoothly within 3-4 seconds.
Here is the prompt when I give campus id it is taking infinite time
GG.CAMPUS_id = : 1;

error while building a view on Application designer "invalid number of column names specified "

SELECT EMPLID
, LST_ASGN_START_DT
FROM PS_JOB A
WHERE A.EFFDT = (
SELECT MAX(EFFDT)
FROM PS_JOB
WHERE A.EMPLID = EMPLID
AND A.EMPL_RCD = EMPL_RCD
AND EFFDT <= SYSDATE )
AND A.EFFSEQ = (
SELECT MAX(EFFSEQ)
FROM PS_JOB
WHERE A.EMPLID = EMPLID
AND A.EMPL_RCD = EMPL_RCD
AND A.EFFDT = EFFDT )
AND HR_STATUS='A'
When running it directly on the db i get no errors but when i compile and build it on application designer I get an error of "invalid number of column names specified "
I have also tried this but still getting the same error.
SELECT A.EMPLID
, A.LST_ASGN_START_DT
FROM PS_JOB A
WHERE A.EFFDT = (
SELECT MAX(EFFDT)
FROM PS_JOB
WHERE A.EMPLID = EMPLID
AND A.EMPL_RCD = EMPL_RCD
AND EFFDT <= SYSDATE )
AND A.EFFSEQ = (
SELECT MAX(EFFSEQ)
FROM PS_JOB
WHERE A.EMPLID = EMPLID
AND A.EMPL_RCD = EMPL_RCD
AND A.EFFDT = EFFDT )
AND A.HR_STATUS='A'
and this also but nothing..
SELECT A.EMPLID
, A.LST_ASGN_START_DT
FROM PS_JOB A
WHERE A.EFFDT = (
SELECT MAX(EFFDT)
FROM PS_JOB B
WHERE A.EMPLID = B.EMPLID
AND A.EMPL_RCD = B.EMPL_RCD
AND B.EFFDT <= SYSDATE )
AND A.EFFSEQ = (
SELECT MAX(EFFSEQ)
FROM PS_JOB C
WHERE A.EMPLID = C.EMPLID
AND A.EMPL_RCD = C.EMPL_RCD
AND A.EFFDT = C.EFFDT )
AND A.HR_STATUS='A'
You have two columns on your select, and probably have a different number of columns on the record definition.
The sql statement and the record definition should have the same number of columns (but not necessarily the same field names)
Look at this example:
record has 5 fields
and select has 5 fields:

someone know why this query dons't work?

When I do this:
select distinct
a.ano ano,
a.mes as mes,
count(*) as percentagem
from (
select substr(intfaims.f_aims_to_fecha#intfaims(nt.roster.dutyday#intfaims,0,2),5,2) as mes,
substr(intfaims.f_aims_to_fecha#intfaims(nt.roster.dutyday#intfaims,0,2),1,4) as ano
from nt.roster#intfaims
where nt.roster.LEG_FLT#intfaims > 0
) a
group by a.ano, a.mes
it works fine
but when I apply a select they doesn't:
select *
from (
select distinct
a.ano ano,
a.mes as mes,
count(*) as percentagem
from (
select substr(intfaims.f_aims_to_fecha#intfaims(nt.roster.dutyday#intfaims,0,2),5,2) as mes,
substr(intfaims.f_aims_to_fecha#intfaims(nt.roster.dutyday#intfaims,0,2),1,4) as ano
from nt.roster#intfaims
where nt.roster.LEG_FLT#intfaims > 0
) a
group by a.ano, a.mes
) b
I get:
Error: no es una expression group by

Ora-00903 invalid table name

I'm trying to make a left join query and getting this error. Can someone tell me what im doing wrong?
SELECT incid,
db_name,
snap_time
FROM
(SELECT incid,
db_name,
(TRUNC(MAX(optime),'MI')-TO_DATE('1970-01-01', 'YYYY-MM-DD')) * 86400000 SNAP_TIME
FROM ticket_details s1
WHERE optime BETWEEN sysdate-1 AND sysdate +6
AND upper(db_name) = upper('EXPP')
GROUP BY incid,
db_name
) s1
LEFT OUTER JOIN
SELECT snap_time ,
instance_name,
cpu_used
FROM
(SELECT (SNAP_TIME-TO_DATE('1970-01-01', 'YYYY-MM-DD')) * 86400000 SNAP_TIME,
instance_name,
ROUND( (
CASE 'CPU_USED'
WHEN 'CPU_USED'
THEN CPU_USED
WHEN 'REDO'
THEN REDO
WHEN 'TPS'
THEN TPS
WHEN 'PROCESS_USED'
THEN PROCESS_USED
WHEN 'LOGONS_PER_SEC'
THEN LOGONS_PER_SEC
WHEN 'LOGICAL_READS_MBPS'
THEN LOGICAL_READS_MBPS
WHEN 'LFS'
THEN LFS
WHEN 'LFPW'
THEN LFPW
WHEN 'SINGLE_BLOCK_READ'
THEN SINGLE_BLOCK_READ
WHEN 'IOPS_MBPS'
THEN IOPS_MBPS
WHEN 'PHY_READS'
THEN PHY_READS
WHEN 'PHY_WRITES'
THEN PHY_WRITES
WHEN 'STREAMS_IO'
THEN STREAMS_IO
WHEN 'RMAN_IO'
THEN RMAN_IO
WHEN 'NETWORK'
THEN NETWORK
WHEN 'CONCURRENCY_AAS'
THEN CONCURRENCY_AAS
WHEN 'COMMIT_AAS'
THEN COMMIT_AAS
WHEN 'USER_IO_AAS'
THEN USER_IO_AAS
WHEN 'SYSTEM_IO_AAS'
THEN SYSTEM_IO_AAS
WHEN 'OTHERS_AAS'
THEN OTHERS_AAS
WHEN 'CONFIG_AAS'
THEN CONFIG_AAS
WHEN 'APP_AAS'
THEN APP_AAS
WHEN 'CLUSTER_AAS'
THEN CLUSTER_AAS
WHEN 'NETWORK_AAS'
THEN NETWORK_AAS
WHEN 'ADMIN_AAS'
THEN ADMIN_AAS
WHEN 'TOTAL_AAS'
THEN TOTAL_AAS
WHEN 'CPU_AAS'
THEN CPU_AAS
WHEN 'USER_CALLS'
THEN USER_CALLS
WHEN 'PGA_USED'
THEN PGA_USED
ELSE NULL
END), 2) CPU_USED
FROM THIRDEYE_ORACLE_METRIC_HIST
) s2 ON s1.db_name = s2.instance_name
AND s1.snap_time = s2.snap_time
I think you are missing a parenthesis after left join:
SELECT incid,
db_name,
snap_time
FROM
(SELECT incid,
db_name,
(TRUNC(MAX(optime),'MI')-TO_DATE('1970-01-01', 'YYYY-MM-DD')) * 86400000 SNAP_TIME
FROM ticket_details s1
WHERE optime BETWEEN sysdate-1 AND sysdate +6
AND upper(db_name) = upper('EXPP')
GROUP BY incid,
db_name
) s1
LEFT OUTER JOIN
( -- This Parenthesis
SELECT snap_time ,
instance_name,
cpu_used
FROM
(SELECT (SNAP_TIME-TO_DATE('1970-01-01', 'YYYY-MM-DD')) * 86400000 SNAP_TIME,
instance_name,
ROUND( (
CASE 'CPU_USED'
WHEN 'CPU_USED'
THEN CPU_USED
WHEN 'REDO'
THEN REDO
WHEN 'TPS'
THEN TPS
WHEN 'PROCESS_USED'
THEN PROCESS_USED
WHEN 'LOGONS_PER_SEC'
THEN LOGONS_PER_SEC
WHEN 'LOGICAL_READS_MBPS'
THEN LOGICAL_READS_MBPS
WHEN 'LFS'
THEN LFS
WHEN 'LFPW'
THEN LFPW
WHEN 'SINGLE_BLOCK_READ'
THEN SINGLE_BLOCK_READ
WHEN 'IOPS_MBPS'
THEN IOPS_MBPS
WHEN 'PHY_READS'
THEN PHY_READS
WHEN 'PHY_WRITES'
THEN PHY_WRITES
WHEN 'STREAMS_IO'
THEN STREAMS_IO
WHEN 'RMAN_IO'
THEN RMAN_IO
WHEN 'NETWORK'
THEN NETWORK
WHEN 'CONCURRENCY_AAS'
THEN CONCURRENCY_AAS
WHEN 'COMMIT_AAS'
THEN COMMIT_AAS
WHEN 'USER_IO_AAS'
THEN USER_IO_AAS
WHEN 'SYSTEM_IO_AAS'
THEN SYSTEM_IO_AAS
WHEN 'OTHERS_AAS'
THEN OTHERS_AAS
WHEN 'CONFIG_AAS'
THEN CONFIG_AAS
WHEN 'APP_AAS'
THEN APP_AAS
WHEN 'CLUSTER_AAS'
THEN CLUSTER_AAS
WHEN 'NETWORK_AAS'
THEN NETWORK_AAS
WHEN 'ADMIN_AAS'
THEN ADMIN_AAS
WHEN 'TOTAL_AAS'
THEN TOTAL_AAS
WHEN 'CPU_AAS'
THEN CPU_AAS
WHEN 'USER_CALLS'
THEN USER_CALLS
WHEN 'PGA_USED'
THEN PGA_USED
ELSE NULL
END), 2) CPU_USED
FROM THIRDEYE_ORACLE_METRIC_HIST
)
)-- This one too
s2 ON s1.db_name = s2.instance_name
AND s1.snap_time = s2.snap_time
...
LEFT OUTER JOIN
SELECT snap_time ,
...
You need some parenthesis here

select rows from selected rows

i have following procedure syntax working :
select count(1) from
from
(
select id,
CASE
when a >= 0 and a <= 30 then 'one'
when a >= 31 and a <= 60 then 'two'
when a >= 61 and a <= 90 then 'three'
else 'NO'
END
FROM tabel_1 t
Where
(
(
TO_CHAR(t.aDate, 'YYYYMMDD') BETWEEN TO_CHAR(pFrom_Date, 'YYYYMMDD') AND
TO_CHAR(pTo_Date, 'YYYYMMDD')
//cond1
) OR
(
TO_CHAR(t.bDate, 'YYYYMMDD') BETWEEN TO_CHAR(pFrom_Date, 'YYYYMMDD') AND
TO_CHAR(pTo_Date, 'YYYYMMDD')
//cond2
)OR
(
TO_CHAR(t.bDate, 'YYYYMMDD') BETWEEN TO_CHAR(pFrom_Date, 'YYYYMMDD') AND
TO_CHAR(pTo_Date, 'YYYYMMDD')
//cond3
)
AND
(
p_Type = 'Admin' AND
t.ID > 0 //condA
)OR
< 0
(
SELECT COUNT(1)
FROM tab_2 t2
WHERE t2.ID = USER_ID AND
t.ID = t2.ID condB
)
)
)
)
I mean that following clause
Where
( (
(
TO_CHAR(t.aDate, 'YYYYMMDD') BETWEEN TO_CHAR(pFrom_Date, 'YYYYMMDD') AND
TO_CHAR(pTo_Date, 'YYYYMMDD')
//cond1
) OR
(
TO_CHAR(t.bDate, 'YYYYMMDD') BETWEEN TO_CHAR(pFrom_Date, 'YYYYMMDD')
AND
TO_CHAR(pTo_Date, 'YYYYMMDD')
//cond2
)OR
(
TO_CHAR(t.bDate, 'YYYYMMDD') BETWEEN TO_CHAR(pFrom_Date, 'YYYYMMDD')
AND
TO_CHAR(pTo_Date, 'YYYYMMDD')
//cond3
) )
should only work for
( (
p_Type = 'Admin' AND
t.ID > 0 //condA
)OR
< 0
(
SELECT COUNT(1)
FROM tab_2 t2
WHERE t2.ID = USER_ID AND
t.ID = t2.ID condB
) )
//p_type is a varchar which has some value to be comapred. and USER_ID is a int which holds a integer value.
i want cond1 OR con2 OR con3 to be worked only for condA OR condB..
i mean i want this result to be displayed only for admin or matched user id for id of tab_2.
i think this is not the correct one. because it work for both OR statements .
can anyone plz help.. thanx in advance
What your sub-query is doing at the moment is:
cond1 OR cond2 OR (cond3 AND condA) OR condB
That is, it will be true if either cond1, cond2 or condB is true or where cond3 and condA are both true.
But what I think you want is:
(cond1 OR cond2 OR cond3) AND (condA OR condB)
Where it is only true if any of cond1, cond2 or cond3 is true and any of condA or condB is true.
If that is the case then you need to put brackets around the first 3 conds and around the last two:
select count(1) from
from
(
select id,
CASE
when a >= 0 and a <= 30 then 'one'
when a >= 31 and a <= 60 then 'two'
when a >= 61 and a <= 90 then 'three'
else 'NO'
END
FROM tabel_1 t
Where
( (
(
TO_CHAR(t.aDate, 'YYYYMMDD') BETWEEN TO_CHAR(pFrom_Date, 'YYYYMMDD') AND
TO_CHAR(pTo_Date, 'YYYYMMDD')
//cond1
) OR
(
TO_CHAR(t.bDate, 'YYYYMMDD') BETWEEN TO_CHAR(pFrom_Date, 'YYYYMMDD') AND
TO_CHAR(pTo_Date, 'YYYYMMDD')
//cond2
)OR
(
TO_CHAR(t.bDate, 'YYYYMMDD') BETWEEN TO_CHAR(pFrom_Date, 'YYYYMMDD') AND
TO_CHAR(pTo_Date, 'YYYYMMDD')
//cond3
) )
AND
( (
p_Type = 'Admin' AND
t.ID > 0 //condA
)OR
< 0
(
SELECT COUNT(1)
FROM tab_2 t2
WHERE t2.ID = USER_ID AND
t.ID = t2.ID condB
) )
)
)
)

Resources