簡體   English   中英

根據列數據查找缺少的行-MySQL

[英]FInd missing row based on Column data -MySQL

我目前正在研究.Net Web表單解決方案,該解決方案可為管理員生成簡短的服務報告以監視技術人員所完成的服務。到目前為止,我在提出有效的SQL(用於MySQl) 並返回數據方面遇到了一些麻煩行以及基於SertvicePrtNum的缺少行,順序正確。 例如:-這是表中的原始數據:-

Id    ServiceRptNum  Customer_ID  Date of Service 
----  -------------  -----------  ---------------
1      1001              3        09/10/1997
2      1003              8        10/06/2005 
3      1005              1        21/02/2003
4      1007              7        1/06/2011
5      1010              4        4/11/2012
6      1002              2        16/01/2003

在此表中缺少ServiceRptNum1004 所以我希望數據庫將結果返回為:-

Id    ServiceRptNum  Customer_ID  Date of Service 
----  -------------  -----------  ---------------
1      1001              3        09/10/1997
2      1002              2        16/01/2003
3      1003              8        10/06/2005 
-      1004              -            - 
4      1005              1        21/02/2003
-      1006              -            -
5      1007              7        1/06/2011
-      1008              -            - 
-      1009              -            -
6      1010              4        4/11/2012

在此,由於無法找到這些記錄,因此sql額外生成了1004、1006、1008、1009。

請注意,插入數據時ID是自動生成的(auto_increment),但是Service ReportNum不是,這是為了使管理員可以稍后將服務報告與手動生成的報告Num(公司服務手冊)。

在此處查找有關如何生成一組連續整數的想法,然后從左外部連接表中進行選擇。 您應該為每個數字獲得一行,但是對於缺失的數字,所有值都將為null。

基本上,您需要發明一個連續的,連續的數字流,然后將實際數據加入其中。 為了使此方法起作用,您需要一個表中有足夠行的表才能生成足夠大的計數器:

select ID, 1000+n as servicerptnum, customer_id, `Date of Service` from
(
 SELECT  @curRow := @curRow + 1 AS n
 FROM    somebigtable 
 JOIN    (SELECT @curRow := 0) r
 WHERE   @curRow<100
) numbergen
LEFT JOIN
tablewithmissingservicerptnum
ON
  servicerptnum = 1000+n

您需要更改上面代碼中的某些內容,因為您從未告訴過我們缺少rptnums的表的名稱。 您還需要利用數據庫中具有比該表更多的行的另一個表,因為此方法的工作方式是對更大的表中的行進行計數,並為每個表賦予一個數字。 如果沒有比該表大的表,則可以通過將較小的表自身交叉連接或使用此表來獲得足夠的行。 somebigtable替換somebigtable thistable CROSS JOIN thistable ,其中該表是缺少thistable CROSS JOIN thistable表的名稱

如果只需要缺少的行,則在SQL的末尾添加WHERE servicerptnum is null

編輯,我看到您的編號已從以下位置更改:

1001
1002
...
1009
10010

至:

1009
1010

servicerptnum = concat('100', cast(n as varchar))條件以前是servicerptnum = concat('100', cast(n as varchar)) ,現在是servicerptnum = 1000+n ..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM