2011-02-17 6 views
0

私は従業員のテーブルがあり、その従業員は他の従業員と関連付けることができます(多対多)。各従業員には、個別に格納される多くの特性があります。sql resultset orderが定義されていますか?

emp: id,name 
related: name,emp1role,emp1id,emp2role,emp2id 
chars: empid,name,value 

「xxx」で関連している従業員のすべての特性を関係とともに取得したいと考えています。私は現在、このクエリを使用しています:

SELECT c.empid, c.Name, c.Value 
FROM chars as c, related as r 
WHERE r.name='xxx' AND (r.emp1id=c.empid OR r.emp2id=c.empid) 

これは動作しemp22 & emp43が関連している場合、それは、私はそうでemp22と続くemp43の文字を取得しています「XXX」を経由して、関連する従業員は別の、すなわち後のものを提供します。このようにして、どの2人の従業員が関連しているかを知ることができます(これは必要です)。しかし、私はこの命令が単なる運であるか、それとも明確に定義されているかを知りたい。これはSQLiteにあります。

定義されていない場合はどうすればいいですか?また、それぞれの役割を知る必要があります。私は好ましくは1つのクエリでそれをやりたい。あなたは他のいくつかのクエリを考えることができますか?事前に

おかげで、
マニッシュ

PS:これらは、実際のテーブルではありません。彼らはここで質問をするのが簡単です。

+3

一般に、SQLで 'ORDER'を明示的に指定しないと、任意の順序で結果を得ることができます。確かに、これはSQLServerで経験したものです。 –

答えて

4

SQLでは、クエリに明示的なORDER BY句がないかぎり、結果の順序は未定義です。だから私は、あなたがしたいと考えている:

SELECT c.empid, c.Name, c.Value 
FROM chars as c, related as r 
WHERE r.name='xxx' AND (r.emp1id=c.empid OR r.emp2id=c.empid) 
ORDER BY c.empid ASC 

私は他のすべてのためのフィールドに一致する複数のレコードがある場合に明白な順序を取得していない場合には、末尾に(例えば、主キーなど)のユニークなフィールドを追加する傾向があり、少なくとも決定的を注文してください。しかし、それは主にスタイルと選択の問題です。それは決して必要ではありません。

+0

ありがとう。しかし、私はempidに基づいて結果をソートする必要はありません。私はどの従業員が関連しているか知ることができません。私が言ったように、私は関連するidsが次々に来るようにempidsを注文します。何かのように: "emp21、emp20、emp24、emp14、emp45、emp02"。ここで、関係は(emp21、emp20)、(emp24,14)などです。私はempidによってORDER BYを行うと失われるこの関係が必要です。 – Manish

+0

次に、私はあなたの最善の選択肢は、何らかの形で出現すべき順序から計算されるいくつかのフィールドを導入することだと考えています。いずれにしても、明示的な「ORDER BY」がなければ、順序は未定義です。多くのRDBMは、挿入された順に行を戻しますが、この動作には依存することはできません。 –

関連する問題