2013-02-17 69 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