2011-02-17 89 views
0

说我的员工表,其中任何员工可以与任何其他雇员(多对多)。每位员工都有许多独立存储的特性。sql结果集的顺序定义?

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”相关然后我得到字符之后。通过这种方式,我可以知道哪两名员工相关(哪些是必需的)。但是,我想知道这个命令是否仅仅是运气,还是定义明确的。这是在SQLite中。

如果没有定义的方式,怎么还能做什么呢?另外,我需要知道他们各自的角色。我想最好在一个查询中完成它。你能想到其他的一些查询吗?

由于提前,
马尼什

PS:这些都不是实际表。他们在这里提出问题的简单性。

+3

一般来说,如果你没有明确指定'ORDER'在SQL那么你可以以任意顺序的结果,当然,这是我已经与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排序结果。我无法知道哪些员工是相关的。就像我曾经说过的,为了让相关的ID一个接一个地出现,我得到了empids。类似于:“emp21,emp20,emp24,emp14,emp45,emp02”。这里的关系是(emp21,emp20),(emp24,14)等等。如果我执行ORDER BY empid,我需要这种关系。 – Manish

+0

那么我相信你最好的选择是引入从它们应该出现的顺序计算莫名其妙一些领域。无论哪种方式,没有明确的'ORDER BY',排序是未定义的。许多RDBM将按照插入的顺序返回行,但不能依赖此行为。 –