2015-12-14 93 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