SQL Anywhere(12) - 左连接,不够独特/唯一吗?

时间:2016-01-06 19:51:04

标签: sql left-join distinct sqlanywhere

对不起的标题感到抱歉,不知道如何更好地说出来。

我试图抛弃父母的任何实例,其中包含一个包含x,y或z的子元素

SELECT P.label, P.creationclass, P.attributes, P.type, P.uniqueid, C.label, C.idx, C.PID, C.creationclass, C.attributes, C.type, C.uniqueid
FROM t_equip_template AS P
LEFT JOIN t_equip_template AS C
ON P.ID = C.PID  //only way to join these
WHERE P.type = '1003'
AND    
C.creationclass NOT LIKE x
AND
C.creationclass NOT LIKE y
AND 
C.creationclass NOT LIKE z;

为了进一步说明,我的结果集删除了某些内容

的实例
 C.creationclass NOT LIKE [x y or z]

但这不够明显,因为有些情况下上面的情况属实,但我仍然得到一个包含P.ID的结果,其中一个孩子实际上有x,y,z为真(尽管它们是未显示在结果列表中)。我宁愿将整个事情抛弃,而不仅仅是x,y,z是或不是真的'

因为这是我加入两个表的唯一方法

P.ID = C.PID

我仍然得到我不想要的P.ID实例。

有没有办法合并' P.uniqueid'如果' x,y,z'是否是P.ID = C.PID'然后抛弃P.uniqueid,而不仅仅是那个特定的&P.CID' P.uniqueid'?

感谢您的帮助。

示例:

 P.ID  P.uniqueid  C.PID  C.creationclass   
 1     00001       1      w  <--There is a 'hidden result' x,y or z for this    
 1     00001       1      v  <--There is a 'hidden result' x for this
 1     00001       1      u  <--There is a 'hidden result' x for this              
 2     00002       2      w
 2     00002       2      v
 3     00003       3      w
 3     00003       3      v

我想要的是:

 P.ID  P.uniqueid  C.PID  C.creationclass   

 2     00002       2      w
 2     00002       2      v
 3     00003       3      w
 3     00003       3      v

我想要的结果抛出00001的每个实例而不是onyl那些没有通过标准的特定实例。

解决方案,感谢@JohnBollinger

        SELECT
        P.label,
        P.creationclass,
        P.attributes,
        P.type,
        P.uniqueid,
        C.label,
        C.idx,
        C.PID,
        C.creationclass,
        C.attributes,
        C.type,
        C.uniqueid
        FROM
        t_equip_template AS P
        LEFT JOIN t_equip_template AS C
        ON P.ID = C.PID
        WHERE
        P.type = '1003'
        AND

        AND NOT EXISTS (
        SELECT 1 FROM
          t_equip_template AS C2
        WHERE
          P.ID = C2.PID
          AND (C2.creationclass  LIKE x
               OR C2.creationclass  LIKE y           
               OR C2.idx LIKE z )
        )

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您需要使用NOT EXISTS(假设SQLAnywhere允许该语法)。

SELECT
    P.label,
    P.creationclass,
    P.attributes,
    P.type,
    P.uniqueid,
    C.label,
    C.idx,
    C.PID,
    C.creationclass,
    C.attributes,
    C.type,
    C.uniqueid
FROM
    t_equip_template AS P
LEFT JOIN t_equip_template AS C ON P.ID = C.PID
WHERE
    P.type = '1003' AND
    NOT EXISTS
    (
        SELECT *
        FROM
            t_equip_template C
        WHERE
            C.PID = P.PID AND
            C.creationclass IN (x, y, z)
    )

答案 1 :(得分:0)

以下是您提出要求的一种方式:

SELECT
  P.label,
  P.creationclass,
  P.attributes,
  P.type,
  P.uniqueid,
  C.label,
  C.idx,
  C.PID,
  C.creationclass,
  C.attributes,
  C.type,
  C.uniqueid
FROM
  t_equip_template AS P
  LEFT JOIN t_equip_template AS C
    ON P.ID = C.PID
WHERE
  P.type = '1003'
  AND NOT EXISTS (
    SELECT 1 FROM
      t_equip_template AS C2
    WHERE
      P.ID = C2.PID
      AND (C2.creationclass LIKE x
           OR C2.creationclass LIKE y
           OR C2.creationclass LIKE z)
  )

对于只考虑连接结果的单行的任何连接或过滤条件,都不能这样做,因为要过滤的信息是多行的函数。