it-swarm.com.de

Auswählen, wenn Gruppieren nach mehr als eine Zeile mit demselben Wert enthält?

Ich versuche, eine Abfrage zu schreiben, die eine Zeile aus Tabelle A zurückgibt, wenn eine Spalte in der verknüpften Tabelle B mehrere unterschiedliche Werte für eine einzelne übereinstimmende Zeile in Tabelle A enthält. (A -> B ist eine Beziehung 1 -> viele.) Ich habe sie erstellt eine SQL-Geige, um dies im Kontext zu demonstrieren: http://sqlfiddle.com/#!6/83952/1

In dieser Geige sollte die Spalte design der Tabelle perf_ticket_type Für jeden ticket_type Mit demselben perf_id Gleich sein, aber ich versuche es Wählen Sie nur die Fälle aus, in denen dies nicht der Fall ist. Für perf_id 3 wird also mehr als ein eindeutiges design mit der Abfrage zurückgegeben, die ich derzeit verwende.

Als Ergebnis möchte ich die beiden Spalten der Tabelle performance nur für perf_id 3, basierend auf den mehreren Werten von design für das perf_id In der verbundene Tisch.

Ich war in der Vergangenheit frustriert, weil ich GROUP BY verstanden habe, daher bin ich mir nicht sicher, ob ich hier etwas anderes tun könnte, um mein gewünschtes Ergebnis zu erzielen. Im Moment denke ich, ich kann auswählen, was ich in der Geige habe, in eine temporäre Tabelle und dann eine andere auswählen auf das mit einer GROUP BY perf_id HAVING COUNT(*) > 1 um zu bekommen, was ich will (gemäß Zeilen auswählen, in denen die Spalte dieselben Daten in mehr als einem Datensatz enthält ), aber das scheint ein zusätzlicher Schritt zu sein.

5
NReilingh

Ihre Idee ist richtig, aber Sie brauchen HAVING COUNT(DISTINCT design) > 1

So was:

WITH multi_design_perfs AS
(SELECT b.perf_id 
FROM perf_ticket_type b
GROUP BY b.perf_id
HAVING COUNT(DISTINCT b.design) > 1
)
SELECT m.perf_id, 
    STUFF((select ', ' + CAST(b.design AS varchar(10))
     FROM perf_ticket_type b 
     WHERE b.perf_id = m.perf_id
     ORDER BY b.design
     FOR XML PATH(''), TYPE).value('.','varchar(max)'),1,2,'')
FROM multi_design_perfs m
;
4
Rob Farley