2015-12-14 89 views
1

我需要帮助,在这里调试我的sql查询。让我说,我有如下所示的表结构。需要帮助调试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

感谢。

+0

你使用MySQL或Sybase?它们不是同一件事。另外,根据您的示例数据和查询,我不明白您的结果集中没有出现重复行。每个主ID都有多行匹配最大行ID。您的查询应为每个主ID 1和2生成4行。您提供的示例数据不具有代表性,或者您发布的查询不是您尝试运行的查询。 – Rabbit

+0

另外,查询是我们第一次听到关于第二个表的信息。我们对此表一无所知,没有示例数据,没有DDL,甚至没有描述它可能包含的内容。由于我们对此一无所知,因此我们对加入时发生的事情一无所知。也许这就是为什么你没有看到主要的ID 2,也许它不是。我们不知道。如果该另一个表有一个主ID为2的行,那么我期望在该主ID的结果集中有4行。话虽如此,你有一个外连接的正确轨道。但是你没有向我们展示你的外连接,所以我们没有太多的诊断。 – Rabbit

+0

@Rabbit我编辑了更多信息的问题。我也给了你确切的信息。我在这里没有错过任何东西。 – SRJ

回答

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仍然存在。这将帮助您确定它掉落的位置,然后查看前一个查询中的值,以查看在添加连接或where子句时是否可以确定哪些值会使其脱落。

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

1

我会补充说,所以我用MySQL来测试这个我没有访问Sybase实例免责声明开始。

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

  • 您需要添加额外的连接条件的基础上,Type名称的两个自定义字段值。
  • 由于您目前正在执行内连接,因此它将不包含结果1中的Primary_Id = 2,因为它没有Param_1的值。因此,您需要将这些更改为左连接。

下小提琴显示使用MySQL的一个例子:http://sqlfiddle.com/#!9/dcb16/1

+0

谢谢。不知何故,我无法打开上面的例子,你有小提琴 – SRJ