2016-07-26 22 views
0

Ich muss eine 'where in (X)' Suche durchführen, in der der Wert von X eine durch Komma getrennte Liste von Werten aus einer Tabelle ist .Wählen Sie ... in (Spalte1) wobei Spalte1 '1,4,7' ist

Tabelle 1:

itemId colors(nvarchar) 
1   1, 3 
2   2 

Tabelle 2:

colorId colorName 
    1  Red 
    2  Yellow 
    3  Blue 

Ich bin für diese Art der Ausgabe suchen ...

itemId colorName 
    1  Red 
    1  Blue 

habe ich versucht, dies aber ich denke, das innere Select muss mehrere Zeilen zurückgeben, damit dies korrekt funktioniert, nicht eine einzelne Zeile, deren Wert ein kommagetrennter Wert ist.

select itemId, colorName 
from Table1 t1 
left join Table2 t2 on t2.colorId in (select colors from Table1 where itemId = 1) 
where itemId = 1; 

Antwort

0

Im Namen der Normalisierung verwenden, können Sie wirklich tabelle1 in

itemid | colorid 
-------+-------- 
    1 |  1 
    1 |  3 
    2 |  2 

nicht nur die durch Komma getrennt drehen sollten, sind Felder zu aktualisieren nervig, aber find_in_set ist eine dieser Funktionen, die ich vermeiden würde, wenn überhaupt möglich. (Weil Sie effektiv nach einer Zahl in einer Zeichenkette suchen, bedeutet dies normalerweise die Suche nach einer Zeichenkette, die weniger effizient ist, als nur die vorgeschlagene Tabelle zu verwenden und nützliche Indizes hinzuzufügen)

Wie auch immer, wenn Sie table_1 ändern würden Abfrage wäre:

SELECT t1.itemid, t2.colorname 
FROM table1 t1 
LEFT JOIN table2 t2 USING (colorid) 
WHERE t1.itemid=1 
ORDER BY t1.itemid 

wenn vielleicht müssen Sie eine Liste von Farbnamen:

SELECT t1.itemid, GROUP_CONCAT(t2.colorname) 
FROM table1 t1 
LEFT JOIN table2 t2 USING (colorid) 
WHERE ... 
GROUP BY t1.itemid 

welche zurückkehren würde die Tupel (1, "Red, Blue") und (2, "Yellow ").

(und in ähnlicher Weise mit GROUP_CONCAT(t2.colorid))

+0

Verstanden, nicht mein Schema wie das Sprichwort sagt. Und das ist ein selten nicht performantes Bit von SQL, also habe ich größere Fische zum braten, als dieses lästige Bit des Schemas anzugehen. – Tony