表1和表2的主键(key1,key2)是相同的.表3是用户定义的表,其中一个列field5对于table2是通用的.我需要从表1和表2中选择行,其中table2中的field5在table3中.我需要以与table3相同的顺序获取行.
key1 key2 field1 field2
key1 key2 field3 field4 field5
字段5
我正在考虑的问题是
select a.key1, a.key2, a.field1, a.field2, b.field3, b.field4
from table1 as a INNER JOIN table2 as b ON a.key1 = b.key1 AND a.key2 = b.key2
where b.field5 in (select field5 from table3)
Run Code Online (Sandbox Code Playgroud)
这不会给我行与表3中相同的顺序.
我需要这样的东西来维持秩序吗?
select a.key1, a.key2, a.field1, a.field2, d.field3, d.field4 from
table1 as a INNER JOIN
(select b.key1, b.key2, b.field3, b.field4
from table2 as b INNER JOIN table3 as c
ON b.field5 = c.field5) as d
WHERE a.key1 = d.key1 AND a.key2 = d.key2
Run Code Online (Sandbox Code Playgroud)
S.L*_*ott 10
订单仅在您使用order by
条款时在最终结果中提供.
如果你想"按照与table3相同的顺序",你必须编写一个适当的order by
子句来重新创建table3中的顺序.
如果连接速度更快,则可以自由地对行进行加扰.
您需要添加 ORDER BY 子句。
SELECT a.key1, a.key2, a.field1, a.field2, d.field3, d.field4
FROM table1 as a INNER JOIN (select b.key1, b.key2, b.field3, b.field4 from table2 as b
INNER JOIN table3 as c ON b.field5 = c.field5) as d
WHERE a.key1 = d.key1 AND a.key2 = d.key2
ORDER BY c.field5;
Run Code Online (Sandbox Code Playgroud)
编辑:
我误解了你的初衷。我的解决方案根据 field5 的“值”进行排序,这可能不是它们在表中的排列顺序。您不能依赖表中行的物理顺序,而且恐怕您尝试做的事情不应该依赖。原因是,如果您后面的是物理顺序,除非表聚集在 field5 上,否则我认为您无法保证顺序将与“与 table3 相同的顺序”匹配。
例如,如果表聚集在 field1 上,并且您按照其他人的建议使用标识或“排序”列进行排序,我预计标识/排序列上的排序与表中行的物理顺序有很大不同。桌子。无论如何,我都不是 SQL Server 专家,但许多数据库也允许行移动,这可能会更改行物理存储的“顺序”,而无需更改排序列中的值,从而再次违反您的规则。
我不确定您为什么需要以如此严格的顺序退回这些内容。如果可能的话,我将消除该约束,并允许通过对列的值进行排序来处理/处理数据,无论该列是 field5 还是其他字段。