2016-08-16 1 views
0

例として2つのテーブルを作成しました。
表1:親アイテムが列挙されている列を作成します。

Gender Table 
    ID | Gender 
--------------------- 
0000-0000 | MALE 
0000-0001 | FEMALE 

表2:

Table 
ID | PARENTID | NAME 
---------------------- 
1 | 0000-0001 | Apple 
2 | 0000-0000 | Bob 
3 | 0000-0000 | Chris 
4 | 0000-0000 | Dan 
5 | 0000-0001 | Elsa 

表2のPARENTIDは、表1のIDを指します。
これから、Appleは女性、Bobは男性です。

ただし、このように出力する必要があります。

List 
----- 
MALE 
Bob 
Chris 
Dan 
FEMALE 
Apple 
Elsa 

これはまったく可能ですか?

select name 
from 
(1 as SortOrder, 'Male' as name 
+ 
2, male names (apply WHERE clause) 
+ 
3, 'Female' 
+ 
4, female names(apply WHERE clause) 
) Q 
order by SortOrder 

UPDATE(ユニバーサルソリューション):

を想定すると:

+0

明示的に指定されていない限り、SQLはセット、順序付けられていないセットを返します。 SQLの方法は、2つの列の結果(名前、性別)です。 –

+0

つまり、あなたのソリューションはSQLに違反しています。これを動的にしたい場合は、すべての性別タイプを識別するダミーの行を挿入します(男性と女性は男女です)。これらの結果がそれらのセットで返されるグループ化集合(GROUP BY GROUPING SETS(()、()など)を使用すると、順序を指定できますが、SELECT文を変更する必要があります。複数のクエリの代わりに1つの複雑なクエリ:)しかし、クエリ結果に識別ラベルが必要ですか? –

答えて

0

使用UNION ALLの結果を結合するあなたは性別テーブルのIDを持っており、そのIDが必要なためである*

(そうでなければ、順序を指定するint列を追加する必要があります)

*名前テーブルの最小IDが負ではないと仮定すると、

select Q.Name 
from 

(select g.GenderID as GenderSortOrder, -1 as NameSortOrder, GenderName as Name 
from #gender g 

union all 

select g.GenderID, t.ID, t.Name 
from #gender g 
    inner join #name t on t.GenderID = g.GenderID) Q 

order by Q.GenderSortOrder, Q.NameSortOrder 
+0

これは動的なようには見えません。両親が性別でなく、親の数が異なる場合はどうなりますか?これはかなりハードコーディングされており、すべてのケースで動作する必要があります。 –

+1

見たいと思われる変化はありますか?その他の性別?ジェンダーテーブルは通常は静的なので、私のソリューションはそれに適しています。一般的な解決策が必要な場合は、クエリを変更する必要があります。私は考えてみましょう... – Anton

+0

はい私はそれが一般的に必要です。どのような出力が必要なのかを示すために、この2つの表を例として作成しました。私がTable1に同性愛アイテムを追加し、Table2で同性愛者と特定する人々の名前をいくつか追加したとしましょう。私はそれがクエリを書き直すことなく、希望の出力を持っていたいと思います。助けてくれてありがとう –

0

この方法を試してみてください:

DECLARE @sql nvarchar(MAX)=''; 
SELECT @sql += 'SELECT '+QUOTENAME(Gender, '''') 
    +' List UNION ALL SELECT NAME FROM Table2 WHERE ParentId='+QUOTENAME(ID, '''') 
    +char(13)+char(10)+'UNION ALL'+char(13)+char(10) 
FROM Table1 

SET @sql = SUBSTRING(@sql, 1, LEN(@sql)-13) 

EXEC(@sql) 
0

UNION ALLを行い、選択されたテーブル伝えるために余分な列tを追加します。 結果を注文する:

select list 
from 
(
    select ID, 1 as t, Gender as list 
    from table1 
    union all 
    select PARENTID, 2 as t, NAME 
    from table2 
) 
order by id, t, list 
関連する問題