Ich schrieb die unten ... nicht sicher, ob Sie Oracle verwenden oder nicht, aber das scheint zu funktionieren. Lassen Sie mich wissen, ob dies für Sie effizienter ist.
select *
from
(
select
t1_id,
LISTAGG(value, '') WITHIN GROUP (ORDER BY value) value_list
from
(
select 1 t1_id, 1 value from dual union all
select 1 t1_id, 2 value from dual union all
select 2 t1_id, 1 value from dual union all
select 2 t1_id, 3 value from dual union all
select 2 t1_id, 2 value from dual union all
select 3 t1_id, 1 value from dual union all
select 3 t1_id, 4 value from dual
)
t2
group by t1_id
)
where
instr('123',value_list) > 0
EDIT: Ich bemerkte das SQLServer-Tag ... gerade jetzt. Das tut mir leid. Also habe ich meine Lösung in SQLServer-Syntax umgeschrieben.
ZUSÄTZLICHE BEARBEITUNG: Richtig Sie sind ... Ich denke, die unten wird dieses Verhalten korrigieren. Ich kann jedoch die Effizienz des folgenden Ansatzes nicht kommentieren. Ich könnte mir vorstellen, dass die In-Line-Funktion von LISTAGG in Oracle effizienter sein könnte - und sei es nur, weil klügere Leute als ich es optimiert haben.
with t2 as
(
select 1 t2_id, 1 t1_id, 1 value union all
select 2 t2_id, 1 t1_id, 2 value union all
select 3 t2_id, 2 t1_id, 1 value union all
select 4 t2_id, 2 t1_id, 3 value union all
select 5 t2_id, 2 t1_id, 2 value union all
select 6 t2_id, 3 t1_id, 1 value union all
select 7 t2_id, 3 t1_id, 4 value
)
SELECT
*
FROM
(
SELECT DISTINCT
b.t1_id,
STUFF(CAST((
SELECT [text()] = '' + cast(a.Value AS VARCHAR(100))
FROM t2 a
WHERE a.t1_id = b.t1_id
ORDER BY a.Value
FOR XML PATH(''), TYPE) AS VARCHAR(1000)), 1, 0, ''
) value_list
from
t2 b
) x
where
CHARINDEX(value_list,'123',1) > 0 OR
CHARINDEX('123',value_list,1) > 0
FINAL EDIT: Sorry, ich habe diese in den Kommentaren getan, wenn ich nicht zu neu erachtet wurde, ein Benutzer, Kommentare hinterlassen zu dürfen. Ich denke du hast Recht. Ich habe die Anforderungen nicht vollständig verstanden, aber ich fange an. Wenn wir sagen, dass wir t2 einen Wert (1,3) hinzufügen, wird mein Prozess bei einer Suche nach "123" erneut fehlschlagen. Ich denke, dass meine derzeitige Lösung falsch ist, aber ich denke, dass es einige Vorzüge geben kann, um zu pivotieren und zu sortieren, um einen effizienteren Mustervergleich zu ermöglichen. Konnte den LISTAGG-Teil davon jedoch wahrscheinlich beseitigen. Aber da Sie bereits eine funktionierende Lösung haben, kann es für mich am besten sein, sich von produktiven Problemen zu verabschieden.
Sorry, ich habe nicht geholfen, haha. Viel Glück für Sie, mein Herr.
im ersten Beispiel, warum es 1 zurückgeben sollte? – SSD
Hier ist ein großartiger Ort, um zu beginnen. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ Wie dort gepostet gibt es einfach nicht viele Informationen hier und welche Informationen es gibt, ist nicht sehr klar. –
2 Saeid, denn das ist Teilmenge der (1,2,3) Set –