2012-08-03 19 views
7

Czy możesz mi pomóc z następnej kwerendy SQL sql.Oracle wybierz z podkwerendą

SELECT "NEWS"."NEWSID" as ID, 
     "NEWS"."SLUG", 
     "NEWS_TRANSLATION".*, 
     (SELECT FILENAME FROM NEWS_MEDIA WHERE NEWSID = ID AND rownum <= 1 ORDER BY POSITION ASC) as FILENAME 
FROM "NEWS" 
INNER JOIN "NEWS_TRANSLATION" ON NEWS.NEWSID = NEWS_TRANSLATION.NEWSID 
WHERE (NEWS.PUBLISH = 1) AND (NEWS_TRANSLATION.LANG = :lang) 
ORDER BY "NEWS"."NEWSID" DESC; 

Kiedy wykonać to zapytanie mam błąd

ORA-00907: missing right parenthesis 
00907. 00000 - "missing right parenthesis" 
*Cause:  
*Action: 
Error at Line: 4 Column: 74 
+1

Jeśli celem jest uzyskanie nazwy pliku pozycji MIN dla elementu wiadomości z news_media, nie sądzę, że rownum jest używane poprawnie. "ORDER BY" jest stosowane po wybraniu jednego rekordu. Musiałby być podporządkowany lub, jeszcze lepiej, połączony osobno z MIN (pozycja). Zobacz http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html – Glenn

Odpowiedz

9

Spróbuj tego:

SELECT "NEWS"."NEWSID" as ID, 
    "NEWS"."SLUG", 
    "NEWS_TRANSLATION".*, 
    (SELECT * FROM (SELECT FILENAME FROM NEWS_MEDIA WHERE NEWSID = ID ORDER BY POSITION ASC) WHERE rownum = 1) as FILENAME 
FROM "NEWS" 
INNER JOIN "NEWS_TRANSLATION" ON NEWS.NEWSID = NEWS_TRANSLATION.NEWSID 
WHERE (NEWS.PUBLISH = 1) AND (NEWS_TRANSLATION.LANG = :lang) 
ORDER BY "NEWS"."NEWSID" DESC; 

Kiedy używasz "zamówienie przez" i " rownum "razem, musisz najpierw zamówić je i poszukać pierwszego rekordu.

1

Spróbuj poprzez usunięcie klauzuli ORDER BY w sub-zapytania.

+0

Próbowałem, ale mam ten sam błąd. – rtyshyk

+0

SELECT FILENAME FROM NEWS_MEDIA WHERE NEWSID = ID AND rownum <= 1; Nie mam pewności co do identyfikatora kolumny, proszę również o jej potwierdzenie. – TechDo

1

Oto działa kod :

SELECT "NEWS"."NEWSID" as ID, 
    "NEWS"."SLUG", 
    "NEWS_TRANSLATION".*, 
    (SELECT FILENAME FROM NEWS_MEDIA WHERE NEWSID = ID AND rownum <= 1) as FILENAME 
FROM "NEWS" 
INNER JOIN "NEWS_TRANSLATION" ON NEWS.NEWSID = NEWS_TRANSLATION.NEWSID 
WHERE (NEWS.PUBLISH = 1) AND (NEWS_TRANSLATION.LANG = :lang) 
ORDER BY "NEWS"."NEWSID" DESC 
+0

To samo 'Błąd w linii: 4 kolumny: 51' – rtyshyk

+0

Zmieniłem ID na NEWS.NEWSID w podzapytanie i wszystko działa dobrze. Ale w jaki sposób mogę to zrobić za pomocą ORDER BY? – rtyshyk

+0

Co chcesz pokazać według 'order by'? Czy jest to "ORDER BY POSITION ASC" jak w pytaniu? – Mistu4u

1

Spróbuj to:

SELECT "NEWS"."NEWSID" AS ID, "NEWS"."SLUG", "NEWS_TRANSLATION".*, 
     (SELECT FILENAME 
      FROM NEWS_MEDIA 
     WHERE NEWSID = "NEWS"."NEWSID" AND ROWNUM <= 1) 
      AS FILENAME 
    FROM  "NEWS" 
     INNER JOIN 
      "NEWS_TRANSLATION" 
     ON NEWS.NEWSID = NEWS_TRANSLATION.NEWSID 
WHERE (NEWS.PUBLISH = 1) AND (NEWS_TRANSLATION.LANG = :LANG) 
ORDER BY "NEWS"."NEWSID" DESC 
+0

Kiedy podkwerenda zwraca tylko jedną wartość foreach rekord w głównej kwerendzie, to dlaczego próbujesz sortować podzapytanie? – hmmftg

+0

Odpowiedzię na twoje pytanie tutaj http://stackoverflow.com/questions/11794242/oracle-select-with-subquery#comment15674817_11796362 – rtyshyk

+0

@Pivasyk Moje pytanie brzmi: jaki jest cel sortowania w podzapytaniu? – hmmftg

-2
SELECT STUDENT_NAME, STUDENT_ALIAS_NAME 
FROM school 
WHERE STUDENT_NAME IN (
     SELECT STUDENT_NAME 
     FROM school 
     WHERE STUDENT_DEPARMENT= 0 
     ); 
+0

Chociaż może to odpowiedzieć na pytanie, proszę utworzyć kopię zapasową kodu z wyjaśnieniem, dlaczego to zadziała i dlaczego jest lepsza niż inne odpowiedzi. –