2017-04-27 76 views
-2

這是我的查詢,我有兩個產品在同一個帳單號上銷售。 我想要打印它們兩個。如何在不使用JOIN子句的情況下做到這一點?MySql錯誤1242:子查詢返回多個行,但查詢不能使用JOINS

select BillNumber, BillDate, 
     (select CustomerName from tblCustomer 
     where tblCustomer.CustomerId = tblBillHeader.CustomerId) as CustomerName, 
     (Select ProductId from tblBillDetail 
     where tblBillHeader.BillNumber = tblBillDetail.BillNumber) as ProductId 
from tblBillHeader; 
+0

編輯你的問題,並提供樣本數據和預期結果。 –

+1

嘗試查找連接 – OTTA

+0

我不允許使用JOINS。我使用WHERE子句和JOINS得到了想要的結果。應該在不使用JOIN的情況下編寫此特定查詢。 (只使用子查詢) –

回答

0

試試這個:

select BillNumber, BillDate, (select CustomerName from tblCustomer where 
tblCustomer.CustomerId = tblBillHeader.CustomerId) as CustomerName, 
tblBillDetail.ProductId as ProductId 
from tblBillHeader 
join tblBillDetail on tblBillDetail.BillNumber = tblBillHeader.BillNumber 
+0

爲什麼不轉換這兩個子查詢? – jarlh

+0

我不允許使用JOINS。我使用WHERE子句和JOINS得到了想要的結果。應該在不使用JOIN的情況下編寫此特定查詢。 (僅限使用子查詢) –

+0

如果不能使用JOIN,那麼您唯一的機會是在子查詢中使用像MIN()或MAX()這樣的集合函數。 SELECT MIN(ProductId)FROM ...),或者你可以使用TOP關鍵字,然後返回第一行,例如SELECT TOP 1 ProductId FROM ... – Koruba

1

只要使用加入

select tblBillHeader.BillNumber,tblBillHeader.BillDate,tblCustomer.CustomerName,tblBillDetail.ProductId from tblBillHeader 
inner join tblCustomer on tblCustomer.CustomerId = tblBillHeader.CustomerId 
inner join tblBillDetail on tblBillHeader.BillNumber = tblBillDetail.BillNumber 
0

性能會吸...

但是,如果你真的不能用加入...我認爲mySQL允許你使用別名在選擇後面的表達式中的列。

如果我可以假設

  1. 每個tblbillheader.customerID有且只有一個客戶相關記錄...
  2. 每個客戶ID將有許多條目tblBillHeader
  3. tblBillDetail.BillNumber聯營一個在tblBillHeader只有一個記錄
  4. tblBillDetail可能有很多記錄一個tblBillHeader.BillNumber

然後,您必須從一對多鏈中的記錄數最多的表開始......在這種情況下tblbillDetail。而所有其他表必須基於它進行子查詢。

SELECT (SELECT BillNumber FROM tblBillHeader WHERE tblBillHeader.BillNumber = tblBillDetail.BillNumber) BillNumber 
    , (SELECT BillNumber FROM tblBillHeader WHERE tblBillHeader.BillNumber = tblBillDetail.BillNumber) BillDate 
    , (SELECT CustomerID FROM tblBillHeader WHERE tblBillHeader.BillNumber = tblBillDetail.BillNumber) CustomerID 
    , (SELECT CustomerName FROM tblCustomer WHERE tblCustomer.CustomerId = CustomerId) as CustomerName 
    , ProductId 
from tblBillDetail 

我不確定的唯一一個是customerName。由於tblBillDetail沒有customerID,我們必須從頭文件獲取它;但由於我們不能使用連接,所以唯一的方法是從先前的內聯選擇查詢的結果中獲取它。我知道Oracle,DB2或SQL Server會支持這個概念;但我想我已經看到它在mySQL中完成了。

,但如果沒有,我們可以有一個嵌套子查詢,以得到它的工作我想......

SELECT (SELECT BillNumber FROM tblBillHeader WHERE tblBillHeader.BillNumber = tblBillDetail.BillNumber) BillNumber 
    , (SELECT BillNumber FROM tblBillHeader WHERE tblBillHeader.BillNumber = tblBillDetail.BillNumber) BillDate 
    , (SELECT CustomerID FROM tblBillHeader WHERE tblBillHeader.BillNumber = tblBillDetail.BillNumber) CustomerID 
    , (SELECT CustomerName FROM tblCustomer WHERE tblCustomer.CustomerId = (SELECT CUSTOMERID from tblbillHeader where tblBillHeader.BillNumber = tblBillDetail.BillNumber)) as CustomerName 
    , ProductId 
from tblBillDetail 

現在,也許你不能使用INNER JOIN,但老式的聯接將被允許?如果這樣的話

SELECT BH.BillNumber 
    , BH.BillDate 
    , C.CustomerID 
    , C.CustomerName 
    , BD.ProductId 
FROM tblBillDetail BD, tblBillHeader BH, tblCustomer C 
WHERE BD.BillNumber = BH.BillNumber 
    and C.CustomerID = BH.CustomerID 

但是,這是加入語法的風格,所以我不認爲這是基於你的問題允許的。

0

如果您不能使用JOIN,並且您需要對SELECT字段使用子查詢,那麼一種解決方案可能是限制子查詢的結果。限制選項包括:

  • 使用aggregate functionsMAX()GROUP_CONCAT()

    select BillNumber, BillDate, 
    (select GROUP_CONCAT(CustomerName) 
         from tblCustomer 
         where tblCustomer.CustomerId = tblBillHeader.CustomerId) as CustomerName, 
    (Select GROUP_CONCAT(ProductId) from tblBillDetail where tblBillHeader.BillNumber = tblBillDetail.BillNumber) as ProductId 
    from tblBillHeader 
    

    隨着GROUP_CONCAT()所有值可以在一個行被組合爲一個列表(例如逗號分隔)。但是,如果你想要單獨的記錄,那麼不使用JOIN(隱式或顯式)就不太可行。使用MIN/MAX將取決於可以消除哪些可能的值...

  • 使用LIMIT條款:

    select BillNumber, BillDate, 
    (select CustomerName 
         from tblCustomer 
         where tblCustomer.CustomerId = tblBillHeader.CustomerId 
         LIMIT 1) as CustomerName, 
    (Select ProductId 
         from tblBillDetail 
         where tblBillHeader.BillNumber = tblBillDetail.BillNumber 
         LIMIT 1) as ProductId 
    from tblBillHeader; 
    

    雖然這可能不會幫助,因爲它會忽略結果。

我試圖製作一個SQLFiddle來演示這些選項。雖然我能夠保存模式,但似乎SQL執行服務目前無法正常工作......當我發現它正在工作時,我會進行更新。

相關問題