2017-01-13 4 views
0

Ich habe eine Tabelle mit den beiden Male & Weibliche Geschlechter (PK (Id), PersonsName, IsMale). Ich möchte einen zufälligen Namen bekommen, aber für beide Geschlechter. Beispiel:Randomly Auswählen mehrerer Datensätze

Select Top 1 PersonsName 
From MyTable 
Where IsMale = '1' 
Order by NewID() 

Select Top 1 PersonsName 
From MyTable 
Where IsMale = '0' 
Order by NewID() 

Wie kann ich diese Aussagen kombinieren, so I 2 Datensätze zurück (1 männlich und 1 weiblicher Namen) von der einer SQL-Anweisung?

Ich habe hier in der Vergangenheit gesehen, dass jemand nur die beiden Anweisungen in derselben SQL-Abfrage, wie so getrennt:

Select Top 1 PersonsName 
From MyTable 
Where IsMale = '1' 
Order by NewID(); 

Select Top 1 PersonsName 
From MyTable 
Where IsMale = '0' 
Order by NewID() 

Jedes Mal, wenn der Code ausgeführt Ich mag zwei völlig zufällige Namen haben und nicht zwei Datensätze des gleichen Geschlechts, also kann ich das Dataset auffüllen und an ein ListView-Steuerelement binden. Ich brauche nur die SQL-Anweisung

+0

Mögliche Duplikat [n Wählen Sie zufällige Zeilen aus SQL Server-Tabelle] (http://stackoverflow.com/questions/848872/select-n-random-rows-from-sql-server-table) – miken32

Antwort

3

Was Sie suchen ist das UNION Stichwort

select PersonsName from (Select TOP 1 PersonsName From MyTable Where IsMale = '1' Order by NewID()) a 
UNION ALL 
Select PersonsName from (Select TOP 1 PersonsName From MyTable Where IsMale = '0' Order by NewID()) b 

Dies wird zurückkehren 1 Ergebnis Set mit 2 Reihen.

+1

Das schlägt fehl und selbst wenn ich in SQL Management Studio setze, sagt es falsche Syntax in der Nähe von Union und andere Leute sagen, dass Sie nur eine Anweisung per Anweisung haben können. Eine andere Frage hier sagt dann, die Aussagen wie einzubetten: wähle * aus (wähle Top 1 ... order by newid()) als T Union select * aus (wähle Top 1 ... order by newid()) als T order by aus PersonsName ASC, die zu funktionieren scheint – MyNameHere

+0

@MyNameHere Syntax behoben, nur die orderby in einer Unterabfrage, Sie möchten UNION ALL anstelle von UNION wie das andere Beispiel, das Sie gefunden haben. Wenn Sie nicht ALL verwenden, erhalten Sie 1 Zeile zurückgegeben, wenn Sie zufällig einen Namen ausgewählt haben, der sowohl ein Jungenname als auch ein Mädchenname ist. Wenn Sie nicht die ALL haben, führt es eine DISTINCT auf das Ergebnis. –

+0

Danke Scott, das ist ein guter Tipp !! – MyNameHere

2

Sie können auch Row_Number() und die WITH TIES-Klausel verwenden. Dies wird jeweils einen von beiden zurückgeben.

Select Top 1 with Ties * 
From YourTable 
Order By Row_Number() over (Partition By IsMale Order by NewID()) 

Auf einer Randnotiz. Top 4 erhalten Sie zwei von jeder

0

Verwenden Union Schlüsselwort für gleiche Duplikate Aufzeichnungen zu vermeiden. Union ist ein Schlüsselwort, verwenden Sie für das Schreiben von zwei SQL-Abfrage die gleichen geben Sie von Datensätzen mit der gleichen Anzahl von Spalten (Spaltennamen können unterschiedlich sein, aber Alias ​​sollte mich für zwei Abfragen gleich).

Select Top 1 PersonsName From MyTable Where IsMale = '1' Order by NewID() union Select Top 1 PersonsName From MyTable Where IsMale = '0' Order by NewID()

+1

Ist das nicht genau dasselbe wie Scott Chamberlains Antwort, außer dass Sie Union statt Union alle haben - und warum sollten Sie versuchen, die zweite Zeile als Duplikat zu entfernen? –

Verwandte Themen