我有两个表有一些常用字段,我用它们将两个表连接在一起。 Point是我需要最终结果表中一个表中的所有行(甚至是与另一个表不匹配的行)。
为此,我需要将两个表连接起来并将我完全需要的表放在左侧并且它可以工作。问题是我失去了这个表的顺序,因为我首先得到每个共同的行,然后是我不想要的所有其他行。
如何保持桌子的顺序?
我正在使用SQL Server 2008
答案 0 :(得分:2)
不,你没有丢失任何订单,因为你从来没有任何开始。
SQL表由无序集组成。除非您明确使用ORDER BY
语句,否则返回结果的顺序不保证。
如果您希望按照特定顺序生成结果,ORDER BY
查询中的该列。
答案 1 :(得分:1)
如果不在查询中编写ORDER BY
,则无法保证按任何特定顺序对结果进行排序,您必须指定ORDER BY
才能按所请求的顺序检索记录。
ORDER BY子句不保证这些时候的有序结果 除非在查询中指定了ORDER BY,否则将查询构造 本身
答案 2 :(得分:1)
使用ORDER BY
列。这将根据您的需要对表格进行排序。
默认值为升序,表示将从A-Z或从最小到最大的数字进行排序。您可以在命令末尾指定DESC
,它将命令Z-A或从最大整数到最小整数
看起来像这样......
SELECT FirstName, LastName FROM Person ORDER BY FirstName ASC/DESC
答案 3 :(得分:1)
您可能需要添加IDENTITY
列以通过插入充当自然顺序。然后使用标识列上的ORDER BY
。您输入该表的任何数据都将按其插入时间进行排序。
答案 4 :(得分:0)
一种解决方案是在表格中添加一个额外的列,并使其成为一个标识字段 然后,您可以通过
在订单中使用该字段create table MyTable(Name varchar(100), OrderField int identity)
因为它是一个标识字段,你可以在插入时省略它,比如
insert into MyTable (Name) values ('whatever')
然后你可以做
select t.Name
from MyTable t
order by t.OrderField
加入任何
select t.Name,
mt.somefieldfromthattable
from MyTable t
left outer join MyOtherTable mt on t.Name = mt.Name
order by t.OrderField
请注意,如果此表中有多条记录,那么OrderField将达到最大值并重新开始。
如果可能是这种情况,那么使用日期时间字段进行排序,尽管它会慢一点,但它永远不会有这个问题