2016-01-06 7 views
1

Извините за плохой титул, не знаете, как это лучше сказать.SQL Anywhere (12) - Left Join, не отличается/уникальным?

Я пытаюсь выкинуть любой экземпляр родителя, который имеет ребенок, который содержит х, у, или г

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; 

Для дальнейшего объяснения, мой результирующий набор удаляет случаи, когда что-то

, но это не является достаточно отчетливым, так как есть случаи, когда вышеприведенное значение истинно, но я все еще получаю результат, содержащий PID, в котором один из его детей действительно имеет x, y, z true (хотя они не отображаются в результирующем списке). Я предпочел бы все, что будет выброшен, а не просто «случай, когда х, у, г является или не является истинным»

Поскольку это мой единственный способ соединения двух таблиц

P.ID = C.PID 

Я все еще получаю экземпляры P.ID, которых я не хочу.

Есть ли способ включить «P.uniqueid», а если «x, y, z» является или не соответствует «P.ID = C.PID», тогда выкиньте P.uniqueid, а не только конкретный экземпляр «C.PID»/«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 не онил конкретные примеры, которые не критерии.

решение, благодаря @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) 
     ) 
+1

Вы имеете в виду, что у родителя может быть несколько детей, и вы хотите исключить родителей, у которых есть * любой * ребенок, который удовлетворяет вашим критериям? –

+3

Может быть полезно, если вы добавите образец данных и нужный результат в свой вопрос. –

+1

Что такое 'sql where (12)' является продуктом db? для вопросов sql включают выборочные данные и выход желаний. –

ответ

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) 
) 

Вы не можете сделать это с любым присоединиться или условие фильтра, который учитывает только одну строку джойна результата, потому что информация, с помощью которого вы хотите фильтровать функцию из нескольких строк.

+0

Спасибо вам большое Джон! Пришлось внести несколько изменений, только из-за отсутствия деталей в моем оригинальном посте. Также пришлось изменить последнее, где предложения от C.creationclass до C2.creationclass – Cjust689

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) 
    ) 

 Смежные вопросы

  • Нет связанных вопросов^_^