我的代码在语法上是正确的,我不认为我需要任何括号, 但它不断出现错误" 00907。 00000 - "错过右括号""没有任何原因解释
SELECT DISTINCT BG.name
FROM Brand_Group BG
WHERE BG.pid=(SELECT P.pid
FROM Indicia_Publisher IP
LEFT JOIN Publisher P ON IP.pid=P.pid
WHERE (IP.cid=(SELECT Country.cid
FROM Country
WHERE Country.name='Belgium') AND ROWNUM<=1)
GROUP BY P.pid
ORDER BY COUNT(P.pid));
答案 0 :(得分:2)
问题与比较子查询中的ORDER BY
有关 - 它是无效的语法,您可以通过运行以下查询来查看:
SELECT * FROM dual WHERE dummy IN (SELECT dummy FROM dual ORDER BY dummy);
删除ORDER BY
子句,您的查询应无问题地运行。
另外,如果您想要返回不同的行并且您没有使用聚合函数(例如MAX,SUM等),那么您应该使用DISTINCT,而不是GROUP BY - 它会使您的意图更加清晰。但是,由于您已使用and rownum = 1
将结果限制为单行,因此使用其中的任何一行都没有多大意义!
您的查询可能应该是:
SELECT DISTINCT bg.name
FROM brand_group bg
WHERE bg.pid = (SELECT p.pid
FROM indicia_publisher ip
LEFT JOIN publisher p
ON ip.pid = p.pid
WHERE ip.cid = (SELECT country.cid
FROM country
WHERE country.name = 'Belgium') AND rownum <= 1);
ETA:我发现我略微误读了原来的SQL并误解了你的想法。看起来你是在具有最高计数的p.pids之后,所以以下内容应该是你之后做的:
SELECT DISTINCT bg.name
FROM brand_group bg
WHERE bg.pid = (SELECT p.pid
FROM (SELECT p.pid,
COUNT(*) cnt,
MAX(COUNT(*)) OVER (PARTITION BY p.id) max_cnt
FROM indicia_publisher ip
LEFT JOIN publisher p
ON ip.pid = p.pid
WHERE ip.cid = (SELECT country.cid
FROM country
WHERE country.name = 'Belgium')
GROUP BY p.pid)
WHERE cnt = max_cnt
AND ROWNUM = 1);
如果有两个或更多个不同的p.pids具有最高计数,and rownum = 1
确保只挑选一个(但它是随机的)。您是否希望在外部查询的比较中使用IN
而不是=
,这样就无需使用rownum = 1
谓词。
答案 1 :(得分:-2)
这是Oracle,SQL Server吗? Oracle不使用left,Sql server没有rownum。您是否期望在子查询中返回一个或多个值。它看起来超过1.然后将BG.cid =()更改为()中的ip.cid。您是否需要该子查询中的组。你没有计算该子查询。
我建议您逐个执行子查询以了解发生的情况
您的原始语法混合了语法(oracle / SqL服务器)。我假设这是Oracle数据库
SELECT DISTINCT BG.name
FROM Brand_Group BG
WHERE BG.pid in
(SELECT P.pid
FROM Indicia_Publisher IP
WHERE
IP.pid=P.pid (+) and
(IP.cid=(SELECT Country.cid
FROM Country
WHERE Country.name='Belgium') AND ROWNUM<=1)
);