2011-10-06 63 views
3

我试图匹配两位数据,添加到现有查询中。SQL加入,不确定复杂查询中的确切语法

我希望查询本身解释了我想要做的事情。我遇到的麻烦该生产线是LEFT JOIN从业人员P于insolvencies.practitioner = practitioners.id,

SELECT DISTINCT  i.id   AS id, 
        i.company  AS company, 
        i.insolvencyDate AS insolvency_date, 
        i.city   AS city, 
        i.createdOn  AS createdOn, 
        1    AS rank_id, 
        t.entryCopy  AS insolvency_type, 
        i.businessNature AS business_nature, 
        p.name   AS pract_comp_name, 
        'I'    AS i_type 
    FROM  insolvencies i, 
     LEFT JOIN practitioners p ON insolvencies.practitioner = practitioners.id, 
     lookupcopy t 
    WHERE i.checked = 1  
     AND t.id  = i.insolvencyType 
     AND i.insolvencyDate >= {ts '2010-01-22 00:00:00'} 
     AND i.insolvencyDate <= {ts '2011-10-20 00:00:00'} 
     AND (LOWER(p.name) LIKE '%Hodgsons%') 
    GROUP BY  id 
+1

为什么要混合ANSI-86和ANSI-92风格的加入的完美例子可能不是一个好主意 –

+0

对我来说,在我的技能水平上,康拉德真的很有帮助。谢谢。 –

回答

2

我认为你正在寻找的东西是这样的:

SELECT DISTINCT i.id AS id 
    , i.company AS company 
    , i.insolvencyDate AS insolvency_date 
    , i.city AS city 
    , i.createdOn AS createdOn 
    , 1 AS rank_id 
    , t.entryCopy AS insolvency_type 
    , i.businessNature AS business_nature 
    , p.name AS pract_comp_name 
    , 'I'  AS i_type 
    FROM insolvencies i 
    LEFT JOIN practitioners p ON insolvencies.practitioner = practitioners.id 
    CROSS JOIN lookupcopy t 
    WHERE i.checked = 1  
    AND t.id  = i.insolvencyType 
    AND i.insolvencyDate >= {ts '2010-01-22 00:00:00'} 
    AND i.insolvencyDate <= {ts '2011-10-20 00:00:00'} 
    AND (LOWER(p.name) LIKE '%Hodgsons%') 
GROUP BY id 

表之间的,相同CROSS JOIN

但无论如何,你应该阅读约cross join,inner joinouter join并使用最适合您的情况。

+0

从[MySQL参考](http://dev.mysql.com/doc/refman/5.0/en/join.html)'在MySQL中,CROSS JOIN是一个等效于INNER JOIN的语法(他们可以互相替换)'那么你在SQL之后写了什么样的有趣的 –

+0

是的,但是根据标准了解其差异并使用它是很好的。并非所有的RDBMS都是MYSQL :) – DavidEG

2

您需要insolvencies i,后删除逗号,使LEFT JOIN适用于表,否则LEFT JOIN是被视为一个独立的表,交叉应用,这是无效的:

FROM insolvencies i 
      --  ^remove comma 
    LEFT JOIN... 
0

的问题是,你的WHERE子句引用LEFT JOIN起来表

WHERE i.checked = 1  
     AND t.id  = i.insolvencyType 
     AND i.insolvencyDate >= {ts '2010-01-22 00:00:00'} 
     AND i.insolvencyDate <= {ts '2011-10-20 00:00:00'} 
     AND (LOWER(p.name) LIKE '%Hodgsons%') 

如果LEFT JOIN找不到匹配项,则p.Name将为NULL。通过在WHERE子句中检查p.Name,可以使LEFT JOIN充当一个FULL JOIN。如果需要检查名称,它应该是LEFT JOIN中ON表达式的一部分

4

这里有很多问题。首先,我拿出逗号并正确加入了lookupcopy。我不是100%确定你的最终目标,但有以下几点入手:

SELECT DISTINCT i.id AS id, 
       i.company AS company, 
       i.insolvencyDate AS insolvency_date, 
       i.city AS city, 
       i.createdOn AS createdOn, 
       1 AS rank_id, 
       t.entryCopy AS insolvency_type, 
       i.businessNature AS business_nature, 
       p.name AS pract_comp_name, 
       'I' AS i_type 
    FROM insolvencies i 
     INNER JOIN lookupcopy t on (t.id = i.insolvencyType) 
     LEFT JOIN practitioners p ON i.practitioner = p.id 
    WHERE i.checked = 1 
     AND i.insolvencyDate >= {ts '2010-01-22 00:00:00'} 
     AND i.insolvencyDate <= {ts '2011-10-20 00:00:00'} 
     AND (LOWER(p.name) LIKE '%Hodgsons%') 
    GROUP BY id 

如果仍然有问题,请发表您的实际误差。

另外,还有一件事:在where子句中引用p.Name将导致从业者和破产人之间的内部联接。这是打算吗?

+0

+1内部连接 – eykanal