2016-07-27 14 views
0

Ich habe eine Tabelle namens FieldList die wie folgt aussieht:Wie mehrere Spalten aus der gleichen Tabelle zu verbinden?

ElementName|Description|comp_id|FieldName 
----------------------------------------- 
Name  | red  | 1  | names 
Name  | blue  | 7  | names 
field  | red  | 1  | names 
boxes  | blue  | 5  | blues 
field  | orange | 7  | reds 

Und ich möchte eine neue Tabelle zeigen, dass nur die ElementNames, die gleich sind zeigt und dann zeigen, welche comp_id sie gehören wie diese so sieht es aus :

ElementName| comp_id| comp_id 
----------------------------- 
Name  | 1  | 7 
field  | 1  | 7 

Dabei spielt es keine genau so aussehen müssen, aber der Punkt ist, ich die ElementNames zu verbinden und zeigen in der Lage sein, die identisch sind, aber unterschiedliche comp_id ‚s haben. Dies ist das bisschen SQL-Code, den ich bereits habe, aber es funktioniert offensichtlich nicht.

SELECT a.comp_id, a.ElementName, b.ElementName 
FROM FieldList a 
INNER JOIN FieldList b ON a.ElementName = b.ElementName; 
+1

Wie viele ähnliche Elementnamen könnte es geben? Wenn die maximale Anzahl nicht bekannt ist, benötigen Sie dynamisches SQL, um dies zu lösen. –

+0

Warum funktioniert das nicht? Was stimmt damit nicht? –

+1

Dies entspricht "wähle a.comp_id, a.elementname von ..." ohne den Join. Es ist ein Equijoin an sich. Wenn Sie eine endliche Anzahl von Werten haben oder wissen, dass es logisch eine Obergrenze gibt, können Sie eine Abfrage erstellen, die erfüllt werden muss. Ich würde gerne diese Lösung zeigen, wenn Sie mir eine Vorstellung davon geben können, wie viele mögliche ElementName-Werte es gibt. –

Antwort

0

Try this ...

SELECT a.ElementName, a.comp_id, b.comp_id 
From FieldList a 
left join FieldList b on 
    a.ElementName = b.ElementName and 
    a.comp_id <> b.comp_id 
WHERE a.comp_id is not null 
+0

Ich denke, du meinst: SELECT a.ElementName, a.comp_id, b.comp_id ... Sie möchten den Elementnamen nicht wiederholen, wenn Sie es unten als Bedingung haben, dass sie a.ElementName = b.ElementName – kbball

+0

sind Vielen Dank. Du hast Recht. – Zach

0

Sie scheinen Elementnamen zu wollen, die die gleichen comp ids haben. Wenn ja, können Sie group_concat() wie folgt verwenden:

select group_concat(elementname), comps 
from (select fl.elementname, group_concat(fl.comp_id order by fl.comp_id) as comps 
     from fieldlist fl 
     group by fl.elementname 
    ) en 
group by comps; 

Dies erzeugt tatsächlich Reihen mit zwei Listen:

Name,field  1,7 

aber scheint es, um die gewünschten Informationen zu enthalten.

0

kann diese Abfrage erreichen, was Sie wollen:

SELECT a.ElementName, a.comp_id, b.comp_id 
    FROM FieldList a 
    JOIN FieldList b ON a.ElementName = b.ElementName 
    WHERE a.comp_id != b.comp_id 
    GROUP BY a.ElementName, (a.comp_id + b.comp_id); 

Bitte beachte, dass ich durch die Zugabe der beiden comp_ids bin Gruppierung. Wenn nicht, würden Sie für jede Vervielfältigung keine Zeilen erhalten.

Verwandte Themen