在DB2中维护秩序;在;查询

在DB2中维护秩序;在;查询,db2,Db2,这个问题的基础是。我正在寻找一种在DB2中有效的解决方案。原来的问题是: 我有下表 DROP TABLE IF EXISTS `test`.`foo`; CREATE TABLE `test`.`foo` ( `id` int(10) unsigned NOT NULL auto_increment, `name` varchar(45) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 然

这个问题的基础是。我正在寻找一种在DB2中有效的解决方案。原来的问题是:

我有下表

DROP TABLE IF EXISTS `test`.`foo`;
CREATE TABLE  `test`.`foo` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(45) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
然后我尝试根据主键获取记录

SELECT * FROM foo f where f.id IN (2, 3, 1);
然后我得到以下结果

+----+--------+
| id | name   |
+----+--------+
|  1 | first  |
|  2 | second |
|  3 | third  |
+----+--------+
3 rows in set (0.00 sec)
可以看到,结果是按id排序的。我试图实现的是按照我在查询中提供的顺序对结果进行排序。给出这个例子,它应该返回

+----+--------+
| id | name   |
+----+--------+
|  2 | second |
|  3 | third  |
|  1 | first  |
+----+--------+
3 rows in set (0.00 sec)

您可以使用派生列进行自定义排序


选择
案例
当serv.serv_deliver_ID='9486154876'时,则为1个ELSE
当serv.serv_deliver_ID='9403149581'时,其他2个3
以自定义订单结束,
...
...
按客户订单订购

您可以使用派生列进行自定义排序


选择
案例
当serv.serv_deliver_ID='9486154876'时,则为1个ELSE
当serv.serv_deliver_ID='9403149581'时,其他2个3
以自定义订单结束,
...
...
按客户订单订购

您可以使用具有所需ID和顺序的派生表,然后将该表加入,例如

SELECT ...
FROM   mcscb.mcs_premise prem
JOIN   mcscb.mcs_serv_deliv_id serv 
  ON   prem.prem_nb = serv.prem_nb 
 AND   prem.tech_col_user_id = serv.tech_col_user_id 
 AND   prem.tech_col_version = serv.tech_col_version 
JOIN (
    SELECT 1, '9486154876' FROM SYSIBM.SYSDUMMY1 UNION ALL
    SELECT 2, '9403149581' FROM SYSIBM.SYSDUMMY1 UNION ALL
    SELECT 3, '9465828230' FROM SYSIBM.SYSDUMMY1 
) B (ORD, ID)
ON    serv.serv_deliv_id = B.ID
WHERE serv.tech_col_user_id = 'CRSSJEFF' 
  AND serv.tech_col_version = '00'
ORDER BY B.ORD

您可以使用具有所需ID和所需顺序的派生表,然后将该表加入,例如

SELECT ...
FROM   mcscb.mcs_premise prem
JOIN   mcscb.mcs_serv_deliv_id serv 
  ON   prem.prem_nb = serv.prem_nb 
 AND   prem.tech_col_user_id = serv.tech_col_user_id 
 AND   prem.tech_col_version = serv.tech_col_version 
JOIN (
    SELECT 1, '9486154876' FROM SYSIBM.SYSDUMMY1 UNION ALL
    SELECT 2, '9403149581' FROM SYSIBM.SYSDUMMY1 UNION ALL
    SELECT 3, '9465828230' FROM SYSIBM.SYSDUMMY1 
) B (ORD, ID)
ON    serv.serv_deliv_id = B.ID
WHERE serv.tech_col_user_id = 'CRSSJEFF' 
  AND serv.tech_col_version = '00'
ORDER BY B.ORD

为了使逻辑更加清晰,您可以修改如下:


为了使逻辑更加清晰,您可以修改如下:



列表中的
没有顺序(在正确的SQL数据库中)。然而,你想要什么样的顺序,为什么,现在还不清楚。我把我的问题改成和我提到的问题一样。对于这个问题,我真的只是在寻找相同的答案,但对于db2来说,
列表中的
没有顺序(无论如何,在一个合适的SQL数据库中)。然而,你想要什么样的顺序,为什么,现在还不清楚。我把我的问题改成和我提到的问题一样。我真的只是在寻找与db2相同的答案。我将我的问题更改为与我引用的问题相同。@AlexM您更改了措辞,但答案仍然相同。SQL没有明确的顺序。如果你想要一个订单,你必须使用
orderby
,要使用它,你必须在……上下订单。。。在本例中,要做到这一点,您必须将所需的顺序与ID关联起来(您不能只是传入一个列表,并期望SQL保持相同的顺序,数据库可以以对其最有意义的方式自由地对列表重新排序)。这就是我的答案。感谢你们不仅回答了我的问题,而且重构了我的查询!我已将我的问题更改为与我引用的问题相同。@AlexM您更改了措辞,但答案仍然相同。SQL没有明确的顺序。如果你想要一个订单,你必须使用
orderby
,要使用它,你必须在……上下订单。。。在本例中,要做到这一点,您必须将所需的顺序与ID关联起来(您不能只是传入一个列表,并期望SQL保持相同的顺序,数据库可以以对其最有意义的方式自由地对列表重新排序)。这就是我的答案。感谢你们不仅回答了我的问题,而且重构了我的查询!我已将我的问题更改为与我正在引用的问题相同。我已将我的问题更改为与我正在引用的问题相同。尝试此操作时,我收到错误
非法符号“ORDERED_IN_LIST”。一些可能合法的符号是:DSN_INLINE_OPT_HINT。SQLCODE=-104,SQLSTATE=42601,DRIVER=4.15.100 SQL Code:-104,SQL State:42601您的Db2版本/平台是什么?您应该在问题中说明这一点。@AlexM db2 for z/os不允许这样使用值。必须是:
将有序的\u in_列表(ord,id)设置为(从sysibm.sysdummy1 union all选择1,'9486154876',从sysibm.sysdummy1 union all选择2,'9403149581',从sysibm.sysdummy1 union all选择3,'94658230',从sysibm.sysdummy1选择…
尝试此操作时,我收到错误
非法符号“有序的\u in_list”。一些可能合法的符号是:DSN_INLINE_OPT_HINT。SQLCODE=-104,SQLSTATE=42601,DRIVER=4.15.100 SQL Code:-104,SQL State:42601您的Db2版本/平台是什么?您应该在问题中说明这一点。@AlexM db2 for z/os不允许这样使用值。必须是:
,有序列表(ord,id)为(从sysibm.sysdummy1 union all选择1,'9486154876',从sysibm.sysdummy1 union all选择2,'9403149581',从sysibm.sysdummy1 union all选择3,'94658230',从sysibm.sysdummy1选择…