2016-05-06 8 views
0

Ich habe zwei Fragen:Zufallsfunktion in SQL nur für eine bestimmte Spalte verwenden

  1. Gibt es eine Möglichkeit, dbms_random.random ODER dbms_random.value in Oracle zu verwenden, indem nur für eine Spalte spezifiziert?

  2. Wenn das obige möglich ist, kann ich den zufällig generierten Wert der Vorkommen maximal 5 mal begrenzen, zum Beispiel?

Ich benutze Oracle 11g :) Danke.

free Tabelle:

freeID | lecturerID | availableID 
    1   1004   10 
    2   1004   11 
    3   1004   12 
    4   1004   13 
    5   1005   11 
    6   1005   12 
    7   1005   13 
    8   1005   14 

Dies ist meine Frage:

SELECT DISTINCT e1.FreeID, e1.lecturerID, e1.AVAILABLEID, 
       e2.FREEID, e2.LECTURERID, e2.AVAILABLEID, 
       s.studentID, s.studentName, s.lecturerID 
FROM  free e1 
INNER JOIN free e2 
     ON e1.availableID = e2.availableID 
JOIN  student s 
     ON s.lecturerID = e1.LECTURERID 
     AND e1.lecturerID='1004' 
     AND e2.lecturerID='1005' 
     AND e1.AVAILABLEID = e2.availableid 

Basierend auf obige Abfrage, ich INNER JOINfree Tabelle mit availableID für lecturerID mit den gleichen availableID zu suchen.

Dann habe ich JOIN wieder mit student Tisch mit lecturerID

Erwartetes Ergebnis:

freeID | e1.lecturerID | e1.availableID | e1.availableID | e2.lecturerID 
     1   1004   13     13    1005 
     2   1004   11     11    1005 
     3   1004   12     12    1005 
     4   1004   13     13    1005 

ich die availableID Spalte wollen so lange nach dem Zufallsprinzip unter ihnen gewählt, da sie beide denselben Wert haben, jeder Dozent hat das gleiche availableID und nicht 5 Vorkommnisse überschreiten. Wenn es überschritten wird, wird es zum nächsten Wert verschoben.

+3

Was meinst du mit nur einer Spalte? Können Sie mit einem Beispielschema und Werten belegen? – Spade

+0

Es ist ein Zufallsgenerator. Sie erzeugen beide einen einzelnen zufälligen Wert. Ich bin verwirrt, was du meinst "nur für eine Spalte" und "maximal 5 mal". Sie würden 5 Zufallszahlen generieren, wenn Sie 5 Zahlen wünschen. – Dresden

+0

Diese Funktionen geben einzelne Werte zurück, sie generieren keine Datenzeilen, sie erhalten eigenständige Zahlen oder Zeichenfolgen. Ich bin mir nicht sicher, was Sie gelesen haben, aber es muss etwas Komplizierteres getan haben. Sie können die Ausgabe einer der beiden Funktionen verwenden, um einen einzelnen Spaltenwert festzulegen. Sie müssen mehr darüber erklären, was Sie zu aktualisieren versuchen und wie - wenn Sie beispielsweise bereits eine Update-Anweisung haben, die Sie ändern möchten. –

Antwort

2

Sie könnten eine Fensterfunktion verwenden, um eine Zeilennummer, in zufälliger Reihenfolge zuzuweisen, zu jeder beitreten innerhalb derselben lecturerID, und dann die Bedingung hinzu, dass nur die ersten 5 getroffen werden sollten:

SELECT * 
FROM (
     SELECT  e1.FreeID, 
        e1.lecturerID, 
        e1.availableID, 
        e2.lecturerID AS lectureID2, 
        s.studentID, 
        s.studentName, 
        ROW_NUMBER() OVER (PARTITION BY e1.lecturerID 
             ORDER BY dbms_random.random) AS rn 
     FROM  free e1 
     INNER JOIN free e2 
       ON e1.availableID = e2.availableID 
     INNER JOIN student s 
       ON s.lecturerID = e1.lecturerID 
     WHERE  e1.lecturerID = '1004' 
       AND e2.lecturerID = '1005' 
     ) 
WHERE rn <= 5 
+0

Vielen Dank für Ihre Zeit :). Ich habe versucht, aber es sagt 'FROM Schlüsselwort nicht gefunden wo erwartet ' – user6185827

+0

Weil es ein Komma fehlt nach' AS lectureID2'. –

+0

Danke @trincot. Es funktioniert soweit gut. Ich lese immer noch die Abfrage. Vielen Dank nochmal :) – user6185827

Verwandte Themen