2013-02-17 67 views
2

所以情況是我有一個查詢,涉及9個表,我需要寫它,因此它返回所有記錄,即使當workorderstates表中的impactid表是NULLmysql左加入9表

上到下面的查詢,我注意到我沒有得到,因爲最初我只是在那裏workorderstates.impactid = impactdefiniton.impactid並在impactidNULLworkorderstates表的情況下,這種情況就不會是真實的,是「開放」的所有結果,從而消除因爲實際上「公開」而應該返回的記錄。

所以我設計了下面這個查詢但我每次運行它的時候,它不會工作。它將返回不唯一的表別名workorder。如果我爲表使用別名,它只會在聯接中的右表上移動,因爲它們不是唯一的。任何人都可以提供任何幫助重組查詢,以便它能工作嗎?我已經嘗試了很多變化和有趣的是第二個查詢ALMOST作品,但它返回重複記錄(在這種情況下,同一個記錄四)

select workorder.workorderid, workorder.siteid, 
FROM_UNIXTIME(workorder.CREATEDTIME/1000, '%m-%d-%Y %H:%i:%s') as createdate, 
categoryname, IFNULL(workorderstates.impactid, "No Set") as impactid, 
IFNULL(impactdefinition.name, "Not Set") as impactname, first_name, 
sdorganization.name, statusname, title 
from workorder, statusdefinition, sitedefinition, sdorganization, 
prioritydefinition, categorydefinition, sduser, aaauser, workorderstates 
left Join impactdefinition on workorderstates.impactid = impactdefinition.impactid 
left join workorder on workorder.workorderid = workorderstates.workorderid 
left join workorderstates on workorderstates.statusid = statusdefinition.statusid 
left join workorder on workorder.siteid = sitedefinition.siteid 
left join sitedefinition on sitedefinition.siteid = sdorganization.org_id 
left join workorderstates on workorderstates.categoryid = categorydefinition.categoryid 
left join workorder on workorder.requesterid = sduser.userid 
left join sduser on sduser.userid = aaauser.user_id 
where statusname='Open' and workorder.createdtime >= '1352678400000' 
and sdorganization.name='MAPL' 
order by workorder.workorderid 

查詢,幾乎工程,但醜(返回重複記錄) :

select workorder.workorderid, workorder.siteid, 
FROM_UNIXTIME(workorder.CREATEDTIME/1000, '%m-%d-%Y %H:%i:%s') as createdate, 
categoryname, IFNULL(workorderstates.impactid, "No Set") as impactid, 
IFNULL(impactdefinition.name, "Not Set") as impactname, first_name, 
sdorganization.name, statusname, title 
from workorder, statusdefinition, sitedefinition, sdorganization, 
prioritydefinition, categorydefinition, sduser, aaauser, workorderstates 
left Join impactdefinition on workorderstates.impactid = impactdefinition.impactid 
where workorder.workorderid = workorderstates.workorderid 
and workorderstates.statusid = statusdefinition.statusid 
and workorder.siteid = sitedefinition.siteid 
and sitedefinition.siteid = sdorganization.org_id 
and workorderstates.categoryid = categorydefinition.categoryid 
and workorder.requesterid = sduser.userid and sduser.userid = aaauser.user_id 
and statusname='Open' and workorder.createdtime >= '1352678400000' 
and sdorganization.name='MAPL' 
order by workorder.workorderid 

任何想法如何讓這個查詢工作?多謝你們!

+0

'選擇唯一...' ? – 2013-02-17 17:21:35

+2

@JanDvorak'DISTINCT',就是......但你是對的。 – 2013-02-17 17:24:07

+0

將'SELECT DISTINCT'投擲到查詢中以抑制重複行,就像在牆上塗抹模具污漬。 – 2013-02-17 17:37:41

回答

1

我看了看您的查詢,我覺得你有關於連接和如何將它們寫一些基本的誤解。這就像你只是在隨機猜測語法,這不是編寫代碼的方式。

我檢查您的查詢,並轉換成SQL-92語法。我必須對連接條件做出一些推論,所以我不能保證它對你的應用程序是正確的,但它更接近法律查詢。

只有我找不到的加入到你的prioritydefinition表在你的榜樣任何條件。這可能是重複行的原因。您正在生成所謂的Cartesian product

select workorder.workorderid, workorder.siteid, 
FROM_UNIXTIME(workorder.CREATEDTIME/1000, '%m-%d-%Y %H:%i:%s') as createdate, 
categoryname, IFNULL(workorderstates.impactid, "No Set") as impactid, 
IFNULL(impactdefinition.name, "Not Set") as impactname, first_name, 
sdorganization.name, statusname, title 
from workorder 
inner join statusdefinition on workorderstates.statusid = statusdefinition.statusid 
inner join sitedefinition on workorder.siteid = sitedefinition.siteid 
inner join sdorganization on sitedefinition.siteid = sdorganization.org_id 
inner join prioritydefinition ...NO JOIN CONDITION FOUND... 
inner join categorydefinition on workorderstates.categoryid = categorydefinition.categoryid 
inner join sduser on workorder.requesterid = sduser.userid 
inner join aaauser on sduser.userid = aaauser.user_id 
inner join workorderstates on workorder.workorderid = workorderstates.workorderid 
left Join impactdefinition on workorderstates.impactid = impactdefinition.impactid 
where statusname='Open' 
and workorder.createdtime >= '1352678400000' 
and sdorganization.name='MAPL' 
order by workorder.workorderid 

你真的需要得到別人誰知道你的應用程序,也知道如何寫SQL你寫更多的SQL連接前輔導你。

0

我也重新格式化您的查詢,但有更直觀分層顯示從第一個(左側)表,它是從(右側)表中獲取其詳細信息的關係。正如比爾提到的,你有一張額外的桌子,它沒有做任何事情,因此也是你的笛卡爾產品。現在

,如果你被卡住,有沒有人真正幫助,這裏是左JOIN VS內加入一個基本。左連接基本上說我想從左邊的表格中找出每條記錄(正如我先列出的那樣),無論在右邊有沒有記錄。如果有匹配,很好,沒有問題......但如果不匹配,您的查詢仍然會運行。

所以,我已經全部設置爲左聯接。您可以根據需要更改您知道的必須始終存在的內容,例如工作訂單由「用戶」輸入。所以你可以改變。希望這可以幫助你。另外,也要看看我是如何從工單嵌套工作有序狀態和工作秩序狀態,以獲得相應的狀態定義,並與工單狀態表相關的其他東西。其他人則與工作秩序直接相關,所以那些人在層級上。最後

一注...不是所有的領域都表。字段參考(我將其更改爲別名以提高可讀性)。所有符合條件的領域,所以你和其他人想幫忙,還是將來讀你的代碼知道磁場的起源,而不僅僅是猜測(其在表中的一個)

select 
     WO.workorderid, 
     WO.siteid, 
     FROM_UNIXTIME(WO.CREATEDTIME/1000, '%m-%d-%Y %H:%i:%s') as createdate, 
     categoryname, 
     IFNULL(WOS.impactid, "No Set") as impactid, 
     IFNULL(ImpD.name, "Not Set") as impactname, first_name, 
     SDO.name, 
     statusname, 
     title 
    from 
     workorder WO 
     LEFT JOIN workorderstates WOS 
      ON WO.workorderid = WOS.workorderid 

      LEFT JOIN statusdefinition StatD 
       ON WOS.statusid = StatD.statusid 

      LEFT JOIN categorydefinition CatD 
       ON WOS.categoryid = CatD.categoryid 

      LEFT JOIN impactdefinition ImpD 
       ON WOS.impactid = ImpD.impactid 

     LEFT JOIN sitedefinition SiteD 
      ON WO.siteid = SiteD.siteid 

      LEFT JOIN sdorganization SDO 
       ON SiteD.siteid = SDO.org_id 
       and SDO.name = 'MAPL' 

     LEFT JOIN sduser U 
      ON WO.requesterid = U.userid 

      LEFT JOIN aaauser AU 
       ON U.userid = AU.user_id 

    where 
      statusname = 'Open' 
     and WO.createdtime >= '1352678400000' 
    order by 
     WO.workorderid 
+0

看看他的第二次嘗試。除impactdefinition以外的所有左連接都是紅鯡魚。這就像他插入他們,因爲他認爲你需要一個左連接來使用'ON'子句。他真正的表格參考是SQL-89格式。 – 2013-02-17 18:02:55

+0

@BillKarwin,是的,我確實看到了這一點,但通過試圖向他展示格式化SQL以更好地瞭解事情發生的方式的更好方式,他最好能夠幫助我們找到自己的答案,看不到或不知道。 – DRapp 2013-02-17 18:31:16