0

我正在尝试比较两个表并处理此操作的结果。

SELECT * FROM table1
WHERE table1.czlowiek_id NOT IN (
    SELECT table2.czlowiek_id
    FROM table2
    WHERE table1.czlowiek_id=table2.czlowiek_id
)  
OR table1.czlowiek_id IN (
    SELECT table2.czlowiek_id
    FROM table2
    WHERE table1.czlowiek_id=table2.czlowiek_id
    AND table2.szkolenie_id IN ('$selected_one')
    AND table1.instruktor IN ('$selected_two')
) 

是否有一些选项可以处理此查询的结果添加另一个 WHERE 语句?

4

3 回答 3

4

您也许可以使用LEFT JOIN. 这将允许您从 table1 中提取 table2 中不存在的所有结果,并从 table1 中提取 table2 中的结果并匹配请求的过滤器。

SELECT
    *
FROM
    table1
    LEFT JOIN table2 ON table1.czlowiek_id=table2.czlowiek_id
WHERE
    table2.czlowiek_id IS NULL
    OR (
        table2.szkolenie_id IN ('$selected_one')
        AND table1.instruktor IN ('$selected_two')
    )
于 2012-07-16T15:21:11.310 回答
1

您可以将您的语句包装在一组括号中,并为其分配一个别名(在关闭的父级之后),并像使用表格一样使用它。(我们称之为内联视图。)

SELECT q.*
  FROM (
         SELECT * FROM table1 ... /*your whole query here*/
       ) q
 WHERE ... 

您可以在 WHERE 子句中引用内联视图返回的任何列。(这种方法对于返回较小(合理大小)结果集的内联视图可以相对较好地工作。但是对于较大的结果集,在外部查询可以运行之前,需要做很多繁重的工作来“实现”该视图. 这是一个有用的模式,但也有可能滥用这种模式,并编写比不使用内联视图的等效语句执行得更可怕的语句。

但我不确定这是你要问的问题。

您可以在 WHERE 子句中添加另一个谓词吗?

当然你可以......只需添加另一个ANDOR关键字,然后添加你的条件测试。请注意 AND 和 OR 之间的优先级。使用括号来指定您期望的顺序是一种很好的做法,这是有区别的......

( a OR b ) AND c  
a OR ( b AND c)

但我不确定这是否能回答你所问的问题。

您的相关子查询可以使用EXISTSand NOT EXISTS,而不是INandNOT IN

我相信这将返回一个等效的结果:

SELECT *
  FROM table1
 WHERE NOT EXISTS 
       ( SELECT 1 FROM table2
          WHERE table2.czlowiek_id=table1.czlowiek_id
       )
    OR EXISTS 
       ( SELECT 1 FROM table2
          WHERE table2.czlowiek_id=table1.czlowiek_id
            AND table2.szkolenie_id IN ('$selected_one')
            AND table1.instruktor IN ('$selected_two')
       )
于 2012-07-16T16:16:05.333 回答
0

有另一种表达方式。这个想法是在 czlowiek_id 级别聚合来自 Table2 的信息,保留有关 szkolenie_id 的信息,因为它可能需要。

这会将查询更改为一个组,然后是一个传统的连接和一个相当正常的 where 子句:

select table1.*
from table1 left outer join
     (select czlowiek_id,
             (case when table2.szkolenie_id IN ('$selected_one') then 1
                   else 0
              end) as flag
      from table2
      group by czlowiek_id
     ) t2
     ON table1.czlowiek_id = t2.czlowiek_id
WHERE t2.czlowiek_id IS NULL OR
      (t2.flag = 1  AND table1.instruktor IN ('$selected_two') ) 
于 2012-07-16T16:00:39.450 回答