如果我放入我的where子句,例如:
select col_1, col_2, col_3
from table_1
where col_1 <> col_2;
如果第1列中的值不等于该行第2列中的值,则不会返回值。
我想要做的是确保第1列中的每个值都不存在于第2列中的任何位置。例如,如果我的表有100行,我想确保第1,2,3行没有值,等等出现在第2列的100行中。
最好的方法是什么?
我在想的是:
with table_2 AS(
select col_1
from table_1
)
select *
from table_1
where col_2 NOT IN
(select col_1
from table_2);
这是否能实现这一目标?
编辑:我正在使用一个有一对多关系的表。我想确保&#34; one&#34;一方都没有在&#34;很多&#34;侧。
编辑第二部分:我做了类似的事情并且没有运气,因为第1列中的值仍显示在第2列,或列_3或列_4等中。
Select *
from table_1 as one
where NOT EXISTS
((select *
from table_two as two
where two.column_2 = one.column_1)
AND
two.column_three = one.column_1));
答案 0 :(得分:2)
我想要做的是确保第1列中的每个值都不存在于第2列中的任何位置。例如,如果我的表有100行,我想确保第1行没有[第1列]值, 2,3列等出现在第2列的100行中。
听起来您正在尝试验证数据,在这种情况下,您可以通过返回失败您的条件的行来获得更好的服务 - column_1值 存在于column_2中的某个位置 - 因此您可以返回并清理它们或评估您的系统以找出它们的来源。此查询将执行此操作:
select distinct t1.*
from table_1 t1
inner join table_1 t2 on t1.column_1 = t2.column_2
根据您的意见:
select distinct t1.*
from table_1 t1
inner join table_1 t2 on t1.column_1 = t2.column_2
union
select distinct t1.*
from table_1 t1
inner join table_1 t2 on t1.column_1 = t2.column_3 -- note the different column
union
select distinct t1.*
from table_1 t1
inner join table_1 t2 on t1.column_1 = t2.column_4
union
select distinct t1.*
from table_1 t1
inner join table_1 t2 on t1.column_1 = t2.column_5
如果你想要一个更简洁的方法来做这个,没有那么多的联合,而不是修复你的架构,因为这是一个弱的架构设计。更好的模式只有两列用于密钥数据,第三列表示此记录指示的关系(列)。