2016-10-27 42 views
3

有两个表TABLE1和TABLE2 TABLE1中有不存在TABLE2中的记录,左连接下面我想查询Table1中的所有记录,如果该记录不存在于table2中。SQL左加入WHERE类

注意:关于我的代码中需要的WHERE类,这是因为,TABLE2中'IN PROGRESS'的名称中可能有多个记录,其中名为'GRADUATED'的记录中有一条记录是基于不同的记录在表1中,如果有'GRADUATE'这个名字的任何记录,它应该只显示它​​应该显示进行中的记录。

SELECT DISTINCT 
     TABLE1.ID, 
     TABLE2.TRAINING_STATUS_CHECK 
FROM TABLE1 
LEFT JOIN TABLE2 
    ON TABLE1.ID = TABLE2.FK_ID_CLASS 
WHERE NOT EXISTS 
    (
    SELECT DISTINCT 
      TABLE1.ID, 
      TABLE2.TRAINING_STATUS_CHECK 
    FROM TABLE1 
    LEFT JOIN TABLE2 
     ON TABLE1.ID = TABLE2.FK_ID_CLASS 
    WHERE TABLE2.TRAINING_STATUS_CHECK = 'GRADUATED') 
OR TABLE2.TRAINING_STATUS_CHECK = 'GRADUATED' 
+0

添加一些样本表数据和预期的结果(以及格式化文本。) – jarlh

+0

那么究竟是什么问题? – Mureinik

+1

你使用什么数据库? –

回答

1

不知道你的问题,但如果你希望所有从表1中谁在表2中没有记录,你就必须做到这一点:

SELECT TABLE1.ID 
FROM TABLE1 
LEFT JOIN TABLE2 ON TABLE1.ID = TABLE2.FK_ID_CLASS 
WHERE TABLE2.FK_ID_CLASS IS NULL 
1

试试这个:

SELECT DISTINCT TABLE1.ID, TABLE2.TRAINING_STATUS_CHECK 
    FROM TABLE1 
    LEFT JOIN TABLE2 
    ON TABLE1.ID = TABLE2.FK_ID_CLASS 
    AND (NOT EXISTS (SELECT 1 
        FROM TABLE2 t 
        WHERE TABLE1.ID = t.FK_ID_CLASS 
         AND t.TRAINING_STATUS_CHECK = 'GRADUATED') 
     OR TABLE2.TRAINING_STATUS_CHECK = 'GRADUATED') 

根据记录,LEFT JOIN右表的条件需要放在ON()条款的内部,或者由于的原因,该连接将转换为比较。

2

其中表之间的relatonship不存在 - 但只有在比较涉及表未“毕业”(我认为)

SELECT DISTINCT 
     TABLE1.ID, 
     TABLE2.TRAINING_STATUS_CHECK 
FROM TABLE1 
LEFT JOIN TABLE2 ON TABLE1.ID = TABLE2.FK_ID_CLASS 
    AND TABLE2.TRAINING_STATUS_CHECK <> 'GRADUATED' 
WHERE TABLE2.FK_ID_CLASS IS NULL 
+0

谢谢,但无法满足我的要求 –

+0

来定义您的需求使用样本数据,和预期的结果。手动准备一个例子,这样我们可以避免混淆词汇。这是解释你想要什么的最好方式 –

1

我看到一些分歧与查询行:

  1. 存在部分与您无关的主查询。我想你需要的部分有一定的关系
  2. 明显不存在不需要
  3. 你在相同的条件筛选列,过滤器主要设置行

据我了解,你想从表1中的所有行与国家“GRADUATED”廉政表2和表1的任何行,其中在表2行不存在或状态不等于“GRADUATED”

SELECT DISTINCT 
     t1.ID, 
     t2.TRAINING_STATUS_CHECK 
FROM TABLE1 t1 
LEFT JOIN TABLE2 t2 ON t1.ID = t2.FK_ID_CLASS 
WHERE NOT EXISTS 
    (
    SELECT NULL /*its not nesessary what you need*/ 
    FROM TABLE1 sub_t1 
    JOIN TABLE2 sub_t2 ON sub_t1.ID = sub_t2.FK_ID_CLASS /* left join replaced to inner */ 
    WHERE sub_t2.TRAINING_STATUS_CHECK = 'GRADUATED' 
     AND sub_t1.ID = t1.ID /*relation with outer query*/ 
    ) 
OR t2.TRAINING_STATUS_CHECK = 'GRADUATED' 
0

在我看来,你有三种不同的情况,可以是“OR ED一起”使用UNION;我个人认为保持三个这样使事情变得更容易阅读和理解分离:

--- ID with GRADUATED exists in TABLE2 
(SELECT ID, 'GRADUATED' AS TRAINING_STATUS_CHECK 
    FROM TABLE1 
    INTERSECT 
    SELECT FK_ID_CLASS, 'GRADUATED' 
    FROM TABLE2 
    WHERE TRAINING_STATUS_CHECK = 'GRADUATED') 

UNION 

--- ID without GRADUATED exists in TABLE2 
(SELECT ID, 'IN PROGRESS' 
    FROM TABLE1 
    MINUS 
    SELECT FK_ID_CLASS, 'IN PROGRESS' 
    FROM TABLE2 
    WHERE TRAINING_STATUS_CHECK = 'GRADUATED') 

UNION 

--- ID does not exist in TABLE2 
(SELECT ID, '{{NONE}}' 
    FROM TABLE1 
    WHERE ID NOT IN (SELECT FK_ID_CLASS FROM TABLE2));