|
Îåêßíçóå áðü ôï ìÝëïò Firebrand. Τελευταία δημοσίευση από το μέλος Firebrand στις 15-01-2012, 09:43. Υπάρχουν 8 απαντήσεις.
-
14-01-2012, 20:35
|
-
Firebrand
-
-
-
Μέλος από τις 06-09-2007
-
-
Δημοσιεύσεις 60
-
-
|
Complex Query μέσα στον ίδιο πίνακα
Γεια χαρά και καλή χρονιά σε όλους!
Έχω το εξής ερώτημα:
Έχω έναν πίνακα ο οποίος έχει τις παρακάτω στήλες: ParentID ChildID ChildCharacteristic1 ChildCharacteristic2 ChildCharacteristic3 ChildCharacteristic4 και PK το οποίο είναι primary key
Κάθε ParentID έχει τουλάχιστον 2 ChildID και σε κάθε σετ το ChildCharacteristic1 είναι ίσο για το ChildID. Ομοίως και το ChildCharacteristic2. Διαφέρουν μόνο τα ChildCharacteristic3 και 4 τα οποία γίνονται Για παράδειγμα σας δίνω τις στήλες με τη σειρά που αναφέρονται παραπάνω χωρίς το PK - το οποίο για αυτο που θέλω να κάνω είναι αχρηστο:
1,Α,2,3,Τ,Υ 1,Β,2,3,Ο,Π 7,G,4,5,Ξ,Κ 7,D,4,5,Λ,Μ 7,E,5,13,Η,Θ 7,F,5,13,Ν,Δ
Θέλω να κάνω ένα select το οποίο να μου επιστρέφει ParentID, ChildID, ChildCharacteristic1, ChildCharacteristic2 Για να το κάνω πιο ξεκάθαρο θέλω να μου επιστρέψει σε σχέση με το παραπάνω παράδειγμα το παρακάτω:
1, Α, Β, 2, 3, Τ, Υ, Ο, Π 7, G, D, 4, 5, Ξ, Κ, Λ, Μ 7, E, F, 5, 13, Η, Θ, Ν, Δ
Πρόκειται για έναν πίνακα με παιδιά και γονείς και κληρονομικότητα. Συγγνώμη για τα dummy data αλλά δεν βρήκα κάτι καλύτερο για να περιγράψω αυτό που προσπαθώ να πετύχω.
Βοήθεια ρε παιδιά γιατί η σχεσιακή μου άλγεβρα sucks! Δεν θέλω να μου δώσετε το SQL που θα κάνει τι δουλειά αν και θα το εκτιμήσω ιδιαίτερα αλλά θα ήθελα και λίγο επεξήγηση αν δεν κάνει κόπο.
ΟΧΙ T-SQL γιατί πρόκειται για SQLite οπότε καθαρή SQL μόνο.
Ευχαριστώ πολύ.
|
|
-
14-01-2012, 21:47
|
-
Markos
-
-

-
Μέλος από τις 26-10-2008
-
Αθήνα
-
Δημοσιεύσεις 874
-
-
|
Απ: Complex Query μέσα στον ίδιο πίνακα
Έτσι όπως έχεις σχεδιάσει τον πίνακα θα έχεις προβλήματα. Πρώτα - πρώτα, το κάθε παιδί έχει δύο γονείς. Ο πίνακας "Parent" πρέπει να σπάσει σε δύο ("Father", "Mother"), οι οποίοι ενδεχομένως να κληρονομούν πεδία από κάποιον πίνακα "Person". Ο πίνακας "Children" πρέπει να έχει πεδία FatherID, MontherID, ChildID. Για τα χαρακτηριστικά πρέπει να φτιάξεις τρίτο πίνακα "Characteristics" με τα αντίστοιχες στήλες ID και Description. Η σχέση Children προς Characteristics πρέπει να είναι many to many. Αν εξαρχής υπάρχουν χαρακτηριστικά για τα οποία σ' ενδιαφέρει ο συνδυασμός, ή θα πρέπει να τα ορίσεις σαν "ένα" χαρακτηριστικό (για απλοποίηση) ή θα πρέπει να δημιουργήσεις κι άλλον πίνακα που θα συμπεριλαμβάνει αυτούς τους συνδυασμούς. Πιστεύω ότι θα είμαι σε θέση να σου απαντήσω καλύτερα αν θελήσεις να γίνει πιο συγκεκριμένος. Πάντως, έτσι όπως το έχεις σχεδιάσει πολλά πράγματα θα πάνε στραβά. Δεν απαντώ ευθέως στο ερώτημά σου γιατί δεν σου κρύβω ότι από την περιγραφή που έχεις κάνει δεν έχω καταλάβει και πολλά πράγματα.
Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
|
|
-
14-01-2012, 21:59
|
-
Firebrand
-
-
-
Μέλος από τις 06-09-2007
-
-
Δημοσιεύσεις 60
-
-
|
Απ: Complex Query μέσα στον ίδιο πίνακα
Markos:Έτσι όπως έχεις σχεδιάσει τον πίνακα θα έχεις προβλήματα. Πρώτα - πρώτα, το κάθε παιδί έχει δύο γονείς. Ο πίνακας "Parent" πρέπει να σπάσει σε δύο ("Father", "Mother"), οι οποίοι ενδεχομένως να κληρονομούν πεδία από κάποιον πίνακα "Person". Ο πίνακας "Children" πρέπει να έχει πεδία FatherID, MontherID, ChildID. Για τα χαρακτηριστικά πρέπει να φτιάξεις τρίτο πίνακα "Characteristics" με τα αντίστοιχες στήλες ID και Description. Η σχέση Children προς Characteristics πρέπει να είναι many to many. Αν εξαρχής υπάρχουν χαρακτηριστικά για τα οποία σ' ενδιαφέρει ο συνδυασμός, ή θα πρέπει να τα ορίσεις σαν "ένα" χαρακτηριστικό (για απλοποίηση) ή θα πρέπει να δημιουργήσεις κι άλλον πίνακα που θα συμπεριλαμβάνει αυτούς τους συνδυασμούς. Πιστεύω ότι θα είμαι σε θέση να σου απαντήσω καλύτερα αν θελήσεις να γίνει πιο συγκεκριμένος. Πάντως, έτσι όπως το έχεις σχεδιάσει πολλά πράγματα θα πάνε στραβά. Δεν απαντώ ευθέως στο ερώτημά σου γιατί δεν σου κρύβω ότι από την περιγραφή που έχεις κάνει δεν έχω καταλάβει και πολλά πράγματα.
Δεν γίνεται να αλλάξη η δομή. Για την ώρα ασχολούμε μόνο με τον ένα parent και μέσα στον συγκεκριμένο πίνακα. Δυστυχώς δεν είναι στο χέρι μου να αλλάξω τη δομή και έτσι από αυτόν τον πίνακα προσπαθώ να τραβήξω τα δεδομένα. Για να σε βοηθήσω να με βοηθήσεις τι περισσότερο χρειάζεσαι σαν πληροφορία; Δεν έχω κάτι περισσότερο. Ακόμα και τα δεδομένα απλά θα πάρουν πραγματικες τιμές αλλά στην ουσία δεν αλλάζει κάτι. Σκέψου ότι αυτός είναι ο πίνακας και δεν αλλάζει.
|
|
-
14-01-2012, 22:06
|
-
Markos
-
-

-
Μέλος από τις 26-10-2008
-
Αθήνα
-
Δημοσιεύσεις 874
-
-
|
Απ: Complex Query μέσα στον ίδιο πίνακα
Ας πάρουμε την περίπτωση:
1,Α,2,3,Τ,Υ 1,Β,2,3,Ο,Π
(EDIT) Αποκλείεται τον συνδυασμό χαρακτηριστικών (2,3) να τον έχει και κάποιο άλλο τέκνο του γονέα 1; Ο κάθε γονέας έχει ΑΚΡΙΒΩΣ δύο τέκνα ή κάποια δύναμη του 2; Π.χ. 2, 4, 8, 16 κ.λ.; Τι θα συμβεί με το query σου αν έχει, για παράδειγμα, 1 ή περιττό αρθμό παιδιών; Επίσης, από τη στιγμή που έχει μόνο ένα ParentID ενδέχεται το τέκνο (και τα χαρακτηριστικά του) να είναι καταχωρημένο δύο φορές. Μία με το ParentID του πατέρα και μία με το ParentID της μητέρας. Big Trouble!!
Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
|
|
-
14-01-2012, 22:19
|
-
Firebrand
-
-
-
Μέλος από τις 06-09-2007
-
-
Δημοσιεύσεις 60
-
-
|
Απ: Complex Query μέσα στον ίδιο πίνακα
Markos:Ας πάρουμε την περίπτωση:
1,Α,2,3,Τ,Υ 1,Β,2,3,Ο,Π
(EDIT) Αποκλείεται τον συνδυασμό χαρακτηριστικών (2,3) να τον έχει και κάποιο άλλο τέκνο του γονέα 1; Ο κάθε γονέας έχει ΑΚΡΙΒΩΣ δύο τέκνα ή κάποια δύναμη του 2; Π.χ. 2, 4, 8, 16 κ.λ.; Τι θα συμβεί με το query σου αν έχει, για παράδειγμα, 1 ή περιττό αρθμό παιδιών; Επίσης, από τη στιγμή που έχει μόνο ένα ParentID ενδέχεται το τέκνο (και τα χαρακτηριστικά του) να είναι καταχωρημένο δύο φορές. Μία με το ParentID του πατέρα και μία με το ParentID της μητέρας. Big Trouble!!
Πάντα υπολόγιζε έναν parent είτε μόνο μητέρα είτε μόνο πατέρα. Επίσης ο αριθμός των παιδιών είναι πάντα ζυγός (de facto). Τώρα το γιατί πάμε με αυτή τη λογική είναι άλλο παραμύθι. Επίσης κάθε παιδί, όπως βλέπεις και απο το παράδειγμα έχει ακριβώς τα ίδια χαρακτηριστικά για το Characteristic1 και 2. Αλλάζουν μόνο τα 3 και 4. Υπάρχει όμως η περίπτωση όπου για το ίδιο parent και διαφορετικά παιδιά τα χαρακτηριστικά 1 και 2 να είναι ίδια π.χ. 5,Τ,4,5,Θ,Ι 5,Υ,4,5,Ο,Π Άρχισε να ξεκαθαρίζει λίγο....;
|
|
-
14-01-2012, 22:33
|
-
Markos
-
-

-
Μέλος από τις 26-10-2008
-
Αθήνα
-
Δημοσιεύσεις 874
-
-
|
Απ: Complex Query μέσα στον ίδιο πίνακα
Με βάση αυτά που γράφεις θα πρέπει να κάνεις ένα self join ως προς το parentID και τα characteristics 1 και 2.
Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
|
|
-
14-01-2012, 23:34
|
-
Firebrand
-
-
-
Μέλος από τις 06-09-2007
-
-
Δημοσιεύσεις 60
-
-
|
Απ: Complex Query μέσα στον ίδιο πίνακα
Markos:Με βάση αυτά που γράφεις θα πρέπει να κάνεις ένα self join ως προς το parentID και τα characteristics 1 και 2.
Μπορείς να το εξηγήσεις λίγο. Δεν μπόρεσα να βγάλω άκρη. Ευχαριστώ
|
|
-
15-01-2012, 03:07
|
-
Markos
-
-

-
Μέλος από τις 26-10-2008
-
Αθήνα
-
Δημοσιεύσεις 874
-
-
|
Απ: Complex Query μέσα στον ίδιο πίνακα
Συγγνώμη για την καθυστέρηση, αλλά εγκατέλειψα τον υπολογιστή αμέσως μετά το τελευταίο post. Λοιπόν, δημιούργησα μια βάση δεδομένων (Parents) κι έναν πίνακα με ονομασία Children και τα εξής δεδομένα (δεν ξέρω πως θα βγει στη μορφοποίηση): ID ParentID ChildID Char1 Char2 Char3 Char4 1 1 A 2 3 T Y 2 1 B 2 3 Ο Π 3 7 G 4 5 Ξ Κ 4 7 D 4 5 Λ Μ 5 7 E 5 13 Η Θ 6 7 F 5 13 Ν Δ Το ID του πίνακα είναι int - autoincrement. Ιδού και το script: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| USE [Parents]
GO
/****** Object: Table [dbo].[Children] Script Date: 01/15/2012 03:02:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Children](
[ID] [int] IDENTITY(1,1) NOT NULL,
[ParentID] [int] NOT NULL,
[ChildID] [nvarchar](2) NOT NULL,
[Char1] [nvarchar](2) NOT NULL,
[Char2] [nvarchar](2) NOT NULL,
[Char3] [nvarchar](2) NOT NULL,
[Char4] [nvarchar](2) NOT NULL,
CONSTRAINT [PK_Children] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO |
Αυτό που θες μπορεί να επιτευχθεί σε δύο joins. Το πρώτο το ονόμασα FirstInnerJoin και είναι το: 1
2
3
4
5
| SELECT dbo.Children.ID, dbo.Children.ParentID, dbo.Children.ChildID AS Child1, dbo.Children.Char1, dbo.Children.Char2, Children_1.ChildID AS Child2, Children_1.Char3,
Children_1.Char4
FROM dbo.Children INNER JOIN
dbo.Children AS Children_1 ON dbo.Children.ParentID = Children_1.ParentID AND dbo.Children.Char1 = Children_1.Char1 AND
dbo.Children.Char2 = Children_1.Char2 AND dbo.Children.ChildID <> Children_1.ChildID AND dbo.Children.ID < Children_1.ID |
Το αποτέλεσμα αυτού του Join είναι: 1 1 A 2 3 B Ο Π 3 7 G 4 5 D Λ Μ 5 7 E 5 13 F Ν Δ Κοντά σ' αυτό που θέλεις, αλλά όχι ακριβώς. Το παρακάτω statement μου δίνει αυτό που ζητάς. Πρόκειται για Join ανάμεσα στον πίνακα Children και στο View FirstInnerJoin: 1
2
3
4
| SELECT dbo.Children.ParentID, dbo.Children.ChildID, dbo.Children.Char1, dbo.Children.Char2, dbo.Children.Char3, dbo.Children.Char4, dbo.FirstInnerJoin.Child2,
dbo.FirstInnerJoin.Char3 AS Char3_2, dbo.FirstInnerJoin.Char4 AS Char4_2
FROM dbo.Children INNER JOIN
dbo.FirstInnerJoin ON dbo.Children.ParentID = dbo.FirstInnerJoin.ParentID AND dbo.Children.ChildID = dbo.FirstInnerJoin.Child1 |
Από την εκτέλεσή του παίρνω: 1 A 2 3 T Y B Ο Π 7 G 4 5 Ξ Κ D Λ Μ 7 E 5 13 Η Θ F Ν Δ Δούλεψα με T-SQL για δική μου ευκολία. Νομίζω ότι δεν θα έχεις πρόβλημα να το μετατρέψεις σε Sqlite. Αν θέλεις, μετέφερε τα δεδομένα σου σε Sql Server για να ελέγξεις τα queries και αν δεις ότι σου κάνουν, προχωράς στη μετατροπή. Επίσης, αν κάτι μου έχει ξεφύγει στο copy - paste, κάνε ένα post... [EDIT] Έχω την εντύπωση ότι μπορεί να γίνει και ένα query, αλλά αυτήν την ώρα δεν έχω καθαρό μυαλό για να το "ζαλίσω" περισσότερο...
Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
|
|
-
15-01-2012, 09:43
|
-
Firebrand
-
-
-
Μέλος από τις 06-09-2007
-
-
Δημοσιεύσεις 60
-
-
|
Απ: Complex Query μέσα στον ίδιο πίνακα
Markos:Συγγνώμη για την καθυστέρηση, αλλά εγκατέλειψα τον υπολογιστή αμέσως μετά το τελευταίο post. Λοιπόν, δημιούργησα μια βάση δεδομένων (Parents) κι έναν πίνακα με ονομασία Children και τα εξής δεδομένα (δεν ξέρω πως θα βγει στη μορφοποίηση): ID ParentID ChildID Char1 Char2 Char3 Char4 1 1 A 2 3 T Y 2 1 B 2 3 Ο Π 3 7 G 4 5 Ξ Κ 4 7 D 4 5 Λ Μ 5 7 E 5 13 Η Θ 6 7 F 5 13 Ν Δ Το ID του πίνακα είναι int - autoincrement. Ιδού και το script: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| USE [Parents]
GO
/****** Object: Table [dbo].[Children] Script Date: 01/15/2012 03:02:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Children](
[ID] [int] IDENTITY(1,1) NOT NULL,
[ParentID] [int] NOT NULL,
[ChildID] [nvarchar](2) NOT NULL,
[Char1] [nvarchar](2) NOT NULL,
[Char2] [nvarchar](2) NOT NULL,
[Char3] [nvarchar](2) NOT NULL,
[Char4] [nvarchar](2) NOT NULL,
CONSTRAINT [PK_Children] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO |
Αυτό που θες μπορεί να επιτευχθεί σε δύο joins. Το πρώτο το ονόμασα FirstInnerJoin και είναι το: 1
2
3
4
5
| SELECT dbo.Children.ID, dbo.Children.ParentID, dbo.Children.ChildID AS Child1, dbo.Children.Char1, dbo.Children.Char2, Children_1.ChildID AS Child2, Children_1.Char3,
Children_1.Char4
FROM dbo.Children INNER JOIN
dbo.Children AS Children_1 ON dbo.Children.ParentID = Children_1.ParentID AND dbo.Children.Char1 = Children_1.Char1 AND
dbo.Children.Char2 = Children_1.Char2 AND dbo.Children.ChildID <> Children_1.ChildID AND dbo.Children.ID < Children_1.ID |
Το αποτέλεσμα αυτού του Join είναι: 1 1 A 2 3 B Ο Π 3 7 G 4 5 D Λ Μ 5 7 E 5 13 F Ν Δ Κοντά σ' αυτό που θέλεις, αλλά όχι ακριβώς. Το παρακάτω statement μου δίνει αυτό που ζητάς. Πρόκειται για Join ανάμεσα στον πίνακα Children και στο View FirstInnerJoin: 1
2
3
4
| SELECT dbo.Children.ParentID, dbo.Children.ChildID, dbo.Children.Char1, dbo.Children.Char2, dbo.Children.Char3, dbo.Children.Char4, dbo.FirstInnerJoin.Child2,
dbo.FirstInnerJoin.Char3 AS Char3_2, dbo.FirstInnerJoin.Char4 AS Char4_2
FROM dbo.Children INNER JOIN
dbo.FirstInnerJoin ON dbo.Children.ParentID = dbo.FirstInnerJoin.ParentID AND dbo.Children.ChildID = dbo.FirstInnerJoin.Child1 |
Από την εκτέλεσή του παίρνω: 1 A 2 3 T Y B Ο Π 7 G 4 5 Ξ Κ D Λ Μ 7 E 5 13 Η Θ F Ν Δ Δούλεψα με T-SQL για δική μου ευκολία. Νομίζω ότι δεν θα έχεις πρόβλημα να το μετατρέψεις σε Sqlite. Αν θέλεις, μετέφερε τα δεδομένα σου σε Sql Server για να ελέγξεις τα queries και αν δεις ότι σου κάνουν, προχωράς στη μετατροπή. Επίσης, αν κάτι μου έχει ξεφύγει στο copy - paste, κάνε ένα post... [EDIT] Έχω την εντύπωση ότι μπορεί να γίνει και ένα query, αλλά αυτήν την ώρα δεν έχω καθαρό μυαλό για να το "ζαλίσω" περισσότερο...
Ειλικρινά παιδευούμουν 10 μέρες τώρα και δεν έβρισκα άκρη. ΧΙΛΙΑ ΕΥΧΑΡΙΣΤΩ! Πείραξα λίγο το πρώτο query και έβγαλα ακριβώς αυτά που ήθελα.
|
|
|
|
|