需要帮助调试SQL查询

时间:2015-12-14 21:39:04

标签: sql database join sybase

我需要帮助调试我的SQL查询。 比方说,我有如下所示的表结构。

我想将结果合并到具有相同Primary_Id和max(Row_Id)

的一行中

例如: - 用于跟随

表:custom_tab_instance 它仅包含' primary_id'和' instance_id'(不是在这里)

表:custom_field_value

    +---------+-------------+----------+-------+
    | Row_Id  | Primary_Id  | Type     | Value |
    +=========+=============+==========+=======+
    | 4       | 1           | Name     | 123   |
    +---------+-------------+----------+-------+
    | 4       | 1           | Param_1  | 456   |
    +---------+-------------+----------+-------+
    | 5       | 1           | Name     | 456   |
    +---------+-------------+----------+-------+
    | 5       | 1           | Param_1  | 213   |
    +---------+-------------+----------+-------+
    | 3       | 2           | Name     | 745   |
    +---------+-------------+----------+-------+
    | 3       | 2           | Param_1  | 012   |
    +---------+-------------+----------+-------+
    | 4       | 2           | Name     | 203   |
    +---------+-------------+----------+-------+

预期结果:

+---------+-------------+------+----------+
| Row_Id  | Primary_Id  | Name | Param_1  |
+=========+=============+======+==========+
| 5       | 1           | 456  | 213      |
+---------+-------------+------+----------+
| 4       | 2           | 203  | NUll     |
+---------+-------------+------+----------+

当前结果集:

+---------+-------------+------+----------+
| Row_Id  | Primary_Id  | Name | Param_1  |
+=========+=============+======+==========+
| 5       | 1           | 456  | 213      |
+---------+-------------+------+----------+

我设法获得第一排。但是对于Promary_Id = 2,我没有看到任何结果。

我的查询:

select
    max_cust.max_row_id as 'Row_Id',  
    cti.primary_id           as 'Primary Id',
    name.value         as 'Name',
    param_1.value      as 'Param_1'   
from  custom_tab_instance cti       
inner join (
             select max(row_id) as max_row_id, primary_id
             from custom_field_value where row_id !=null
             group by primary_id
        )max_cust
on max_cust.primary_id=cti.primary_id 

join custom_field_value name 
        on name.primary_id =max_cust.primary_id 
        and max_cust.max_row_id=name.row_id

join custom_field_value param_1
        on param_1.primary_id =max_cust.primary_id 
        and max_cust.max_row_id=param_1.row_id

我在这里缺少什么?我试图做左连接,但它不起作用。

注意: 我正在使用Sybase

感谢。

2 个答案:

答案 0 :(得分:3)

您可以通过简化查询然后一次添加一大块信息来调试此操作,直到丢失记录为止。有点像这样:

select * 
from   custom_tab_instance cti       

select max(row_id) as max_row_id, primary_id
from custom_field_value 
where row_id !=null
group by primary_id

select * 
from  custom_tab_instance cti       
inner join (
    select max(row_id) as max_row_id, primary_id
    from custom_field_value where row_id !=null
    group by primary_id
)max_cust
on max_cust.primary_id=cti.primary_id 

select * 
from  custom_tab_instance cti       
inner join (
     select max(row_id) as max_row_id, primary_id
     from custom_field_value where row_id !=null
     group by primary_id
)max_cust
on max_cust.primary_id=cti.primary_id 
join custom_field_value name 
on name.primary_id =max_cust.primary_id 
and max_cust.max_row_id=name.row_id

select * 
from  custom_tab_instance cti       
inner join (
     select max(row_id) as max_row_id, primary_id
     from custom_field_value where row_id !=null
     group by primary_id
)max_cust
on max_cust.primary_id=cti.primary_id 
join custom_field_value name 
on name.primary_id =max_cust.primary_id 
and max_cust.max_row_id=name.row_id
 join custom_field_value param_1
on param_1.primary_id =max_cust.primary_id 
and max_cust.max_row_id=param_1.row_id       

注意我使用select *而不是你的字段列表。这是因为有时不同的字段是导致问题的原因,因此在尝试找出相对复杂的东西时查看所有字段通常很有帮助。不要在最终查询中留下Select *。它仅用于调试。

另请注意,如果您有大量结果,则可能需要添加一个where子句,专门限制您正在测试的记录,例如

WHERE cti.primary_id = 2

这只是用于调试,你会在完成后删除它。

运行上面的每个查询后,检查primary_id是否仍然存在。这将帮助您确定它脱落的位置,然后查看上一个查询中的值,以确定在添加join或where子句时是否可以识别哪些值导致它掉出来。

我的猜测是派生表最有可能出现问题的地方。或者这些数据甚至可能不在第一个表格中(这不是我第一次感到惊讶)。

答案 1 :(得分:1)

我首先要添加一个我无法访问Sybase实例的免责声明,所以我使用MySQL来测试它。

您发布的查询几乎正确但是有几个问题:

  • 您需要根据Type名称为两个自​​定义字段值添加其他加入条件。
  • 由于您当前正在执行内部联接,因此结果中将排除 Primary_Id = 2 ,因为它没有Param_1的值。因此,您需要将这些更改为左连接。

以下小提琴显示了使用MySql的示例:http://sqlfiddle.com/#!9/dcb16/1