Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα!

 

Θα ήθελα βοήθεια με μια FULL OUTER JOIN στην ACCESS 2010 απλά πρόκειται για δυο tables με many το many relationship. Βρήκα στο internet ένα παράδειγμα αλλα πρόκειται για one το many relationship που γίνεται αρκετά εύκολα αλλα δεν μπόρεσα να το εφαρμόσω στη δικη μου περίπτωση.
Έχω λοιπόν τον πινακα Server και τον πινακα Application και τον ενδιάμεσο πινακα ServerID-"ApplicationID".
Πως μπορώ να δημιουργήσω μια FULL OUTER JOIN για αυτούς τους δυο πίνακες?
 

Ευχαριστώ πολύ εκ των προτερων.

Δημοσ. (επεξεργασμένο)

Θες να γράψεις ένα query με full outer join η ρωτάς πως θα φτιάξεις ενα junction table για τους πινακες σου ;

Ουπς εντάξει θες να γράψεις ένα full outer join . Κάνε simulate το full outer join με union του left και right outer join

 

Επεξ/σία από Aztec
Δημοσ.

Θες να γράψεις ένα query με full outer join η ρωτάς πως θα φτιάξεις ενα junction table για τους πινακες σου ;

 

Ουπς εντάξει θες να γράψεις ένα full outer join . Κάνε simulate το full outer join με union του left και right outer join

Όχι θέλω να γράψω ένα query με full outer join.

Απότι έψαξα πρέπει να κάνω 3 queries στο σύνολο k να τα ενώσω με union.

 

Δημοσ.

Με ενα union λογικά γινεται έτσι

select a.serverid,b.appid
from server a left outer join endiameso b on(a.serverid=b.serverid)
union
select a.serverid,b.appid
from endiameso a right outer join application b on(a.appid=b.appid)


Δημοσ.

SELECT * FROM endiameso

LEFT JOIN server ON  server.id  endiameso.id
LEFT JOIN application ON application.id =   endiameso.id

 

η αμα δεν κανει αυτο, 

 

select * FROM (SELECT * FROM endiameso

LEFT JOIN server ON  server.serverid  endiameso.endiamesoid ) as k 

LEFT JOIN k ON k.serveridid  =   endiameso.endiamesoid

 

οπου * προφανος αυτα που θελεις. Ειμαι λιγο σκουριασμενος στα query αλλα νομιζω ενα απο τα δυο θα κανει, εστω και αν ισως χρειαζεται μικρες μετατροπες.

Να εχεις στο μυαλο σου οτι μπορεις γενικα να κανεις

select FROM ( ενα αλλο select * εδω μεσα με left join etc ) as kati 

Left Join etc etc on Kati.id = etc etc.

ωστε να κανεις μια αλυσιδα σε εισαγωγικα.

 Οπως και να εχει union δεν χρειαζεσαι.

Δημοσ.

SELECT * FROM endiameso

LEFT JOIN server ON  server.id  endiameso.id

LEFT JOIN application ON application.id =   endiameso.id

 

η αμα δεν κανει αυτο, 

 

select * FROM (SELECT * FROM endiameso

LEFT JOIN server ON  server.serverid  endiameso.endiamesoid ) as k 

LEFT JOIN k ON k.serveridid  =   endiameso.endiamesoid

 

οπου * προφανος αυτα που θελεις. Ειμαι λιγο σκουριασμενος στα query αλλα νομιζω ενα απο τα δυο θα κανει, εστω και αν ισως χρειαζεται μικρες μετατροπες.

Να εχεις στο μυαλο σου οτι μπορεις γενικα να κανεις

select FROM ( ενα αλλο select * εδω μεσα με left join etc ) as kati 

Left Join etc etc on Kati.id = etc etc.

ωστε να κανεις μια αλυσιδα σε εισαγωγικα.

 Οπως και να εχει union δεν χρειαζεσαι.

 

Ας φτιάξουμε μερικούς πίνακες να δούμε τι γίνεται

Table server 
-----------------
1
2
3

Table Application 
----------------
4
5
6

Table serv_app (junction)
----------------
NO VALUES


Query

SELECT * FROM serv_app
LEFT JOIN server ON  (server.id =  serv_app.serverid)
LEFT JOIN application ON (application.id =   serv_app.appid);

No results. Αυτό το query έχει νόημα αν συνδέεις τον πρώτο πίνακα με άλλους δύο και βαράς δυο left outer join. 

 

 

Το φτιάχνω λίγο καλύτερα γιατί κατάλαβα τι πας να κάνεις

select *
from server a left outer join serv_app b on(a.id=b.serverid)
right outer join application c on (b.appid=c.id);

NULL, NULL, NULL, '4'
NULL, NULL, NULL, '5'
NULL, NULL, NULL, '6'

Χάθηκαν οι εγγραφές του server (γιατί όμως ?)

 

Για το δέυτερο που αναφέρεις το εγγραψα λίγο διαφορετικά

select * FROM (SELECT * FROM server a
LEFT JOIN serv_app b ON a.id =  b.serverid )  k
RIGHT JOIN application p ON p.id  =  k.appid;

NULL, NULL, '4'
NULL, NULL, '5'
NULL, NULL, '6'

Αν όντως έχεις κάποια clean ιδέα ρίξε την .Πρέπει να επιστρέψει αυτό

select *
from server a left outer join serv_app b on(a.id=b.serverid)
union
select *
from serv_app a right outer join application b on(a.appid=b.id);

'1', NULL, NULL
'2', NULL, NULL
'3', NULL, NULL
NULL, NULL, '4'
NULL, NULL, '5'
NULL, NULL, '6'

Δημοσ.

 

Ας φτιάξουμε μερικούς πίνακες να δούμε τι γίνεται

Table server 
-----------------
1
2
3

Table Application 
----------------
4
5
6

Table serv_app (junction)
----------------
NO VALUES


Query

SELECT * FROM serv_app
LEFT JOIN server ON  (server.id =  serv_app.serverid)
LEFT JOIN application ON (application.id =   serv_app.appid);

No results. Αυτό το query έχει νόημα αν συνδέεις τον πρώτο πίνακα με άλλους δύο και βαράς δυο left outer join. 

 

 

Το φτιάχνω λίγο καλύτερα γιατί κατάλαβα τι πας να κάνεις

select *
from server a left outer join serv_app b on(a.id=b.serverid)
right outer join application c on (b.appid=c.id);

NULL, NULL, NULL, '4'
NULL, NULL, NULL, '5'
NULL, NULL, NULL, '6'

Χάθηκαν οι εγγραφές του server (γιατί όμως ?)

 

Για το δέυτερο που αναφέρεις το εγγραψα λίγο διαφορετικά

select * FROM (SELECT * FROM server a
LEFT JOIN serv_app b ON a.id =  b.serverid )  k
RIGHT JOIN application p ON p.id  =  k.appid;

NULL, NULL, '4'
NULL, NULL, '5'
NULL, NULL, '6'

Αν όντως έχεις κάποια clean ιδέα ρίξε την .Πρέπει να επιστρέψει αυτό

select *
from server a left outer join serv_app b on(a.id=b.serverid)
union
select *
from serv_app a right outer join application b on(a.appid=b.id);

'1', NULL, NULL
'2', NULL, NULL
'3', NULL, NULL
NULL, NULL, '4'
NULL, NULL, '5'
NULL, NULL, '6'

   Ε κοιτα προφανος τα query μου εχουνε νοημα αμα ο πινακας που ενωνει τους δυο προηγουμενους εχει καποια στοιχεια. Φυσικα αμα ειναι null τοτε πρεπει να παρεις σαν συνολοικο αποτελεσμα no result , γιατι δεν εχουνε τιποτα κοινο. 

 

  Και ενα ακομη ερωτημα μου ειναι ποιο το νοημα να εχεις εναν τριτο πινακα ισα ισα ωστε να κανεις AppID = serverID, και να μην κανεις απλα ενα field στον server,  server_appid το οποιο ειναι linked με το appid ; 

Δημοσ.

   Ε κοιτα προφανος τα query μου εχουνε νοημα αμα ο πινακας που ενωνει τους δυο προηγουμενους εχει καποια στοιχεια. Φυσικα αμα ειναι null τοτε πρεπει να παρεις σαν συνολοικο αποτελεσμα no result , γιατι δεν εχουνε τιποτα κοινο. 

 

  Και ενα ακομη ερωτημα μου ειναι ποιο το νοημα να εχεις εναν τριτο πινακα ισα ισα ωστε να κανεις AppID = serverID, και να μην κανεις απλα ενα field στον server,  server_appid το οποιο ειναι linked με το appid ; 

 

αν δεν έχουν τίποτα κοινό πρεπει να φέρεις όλους τους server και όλα τα applications εφόσον μιλάμε για simulated full outer join .

 

Στο ερώτημα σου εδω έχουμε many to many relationship. Δηλαδή ένας server μπορεί να έχει πολλά applications και ένα application μπορεί να είναι σε πολλούς server. Σε αυτή την περίπτωση χρησιμοποιείς Junction table

Δημοσ.

Ναι ναι φυσικά και υπάρχει junction table.
Σας επισυνάπτω μια εικόνα για να δείτε ακριβώς πως είναι η σχέση των tables.
Προσπάθησα όλα όσα γράψατε αλλα δεν μου βγάζει αποτελέσματα. Μου βγάζει ότι υπάρχει πρόβλημα στην from.
Ευχαριστώ για τι βοήθεια... Ελπίζω να βοηθήσει η εικόνα.

post-323555-0-31094900-1421920072_thumb.jpg

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...