2016-07-20 46 views
0

我在客戶表中有一些數據,其他表中沒有數據。所以,當我嘗試使用下面的查詢來選擇,它給了我當沒有使用LEFT JOIN的結果時,Mysql列不能爲空錯誤

1048列「客戶ID」不能爲空

。可能是什麼問題呢。有沒有解決方案?

SELECT c.*, fd.ruakzat as ruak, 
     fd.khatzat as khat, 0+0 as belh, 0+0 as neih, 
     puk.lended as hawh 
     FROM `customer` c 
     LEFT JOIN ( 
       SELECT s.customerid, o.orderzat as ruakzat, 
         f.filled as khatzat  
       FROM `sale` s  
       LEFT JOIN (  
         SELECT SUM(quantity) as orderzat,invoiceno  
         FROM `order`  
         WHERE fillstatus='Empty' 
         GROUP BY invoiceno  
       ) AS o ON s.invoiceno=o.invoiceno  
       LEFT JOIN (  
         SELECT SUM(quantity) as filled,invoiceno  
         FROM `order`  
         WHERE fillstatus='Filled'  
         GROUP BY invoiceno  
       ) AS f ON s.invoiceno=f.invoiceno  
     ) AS fd ON c.id=fd.customerid  
     LEFT JOIN (  
      SELECT SUM(quantity) as lended, customerid  
      FROM `lending`  
     ) AS puk ON c.id=puk.customerid  
     WHERE (puk.customerid IS NULL OR c.name LIKE '%%') 

什麼是更好的方法?謝謝你的幫助。

+0

看看'c.id = fd.customerid'單之一。你說其他表格中沒有customerid。看起來像fd.customerid來自'sale'表。 –

+0

是的,你是對的。但該表中沒有數據。但customerid領域在那裏。 –

+2

您是否正在嘗試'INSERT INTO ... SELECT'? – Philipp

回答

2

MySQL在類似問題(https://bugs.mysql.com/bug.php?id=31450https://bugs.mysql.com/bug.php?id=35633,https://bugs.mysql.com/bug.php?id=52441)附近有一些bug報告,所以有可能你遇到了同樣的錯誤。總結它:如果根據定義(在create table中定義爲不爲空),該字段不可空,但出現在輸出結果可能爲空的子查詢中。

請檢查您的MySQL版本,因爲它可能是一個上述列出的錯誤之一出現的版本。

此外,我子查詢

  SELECT SUM(quantity) as lended, customerid  
     FROM `lending`  

並沒有什麼太大的意義,因爲沒有GROUP BY部分。這將把貸款表合併爲一條記錄,隨機從其中一條記錄中選擇customerid。所以,我會將group by customerid添加到上述子查詢中。

+0

感謝您的回答。我也剛剛發現問題來自貸款表。我添加了組BY,它工作。謝謝。 –

1

不相關的問題,但你可以取代這兩個加入

 LEFT JOIN (  
       SELECT SUM(quantity) as orderzat,invoiceno  
       FROM `order`  
       WHERE fillstatus='Empty' 
       GROUP BY invoiceno  
     ) AS o ON s.invoiceno=o.invoiceno  
     LEFT JOIN (  
       SELECT SUM(quantity) as filled,invoiceno  
       FROM `order`  
       WHERE fillstatus='Filled'  
       GROUP BY invoiceno 

使用Conditional SUM

 LEFT JOIN (  
       SELECT invoiceno, 
         SUM(CASE WHEN fillstatus='Empty' THEN quantity 
                 ELSE 0 
          END) as orderzat,  
         SUM(CASE WHEN fillstatus='Filled' THEN quantity 
                 ELSE 0 
          END) as filled  
       FROM `order`  
       GROUP BY invoiceno  
     ) AS o ON s.invoiceno=o.invoiceno