2016-01-27 123 views
0

如果我把我的where子句中,是這樣的:「IN」謂詞在SQL

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

這是否做到這一點?

編輯:我正在與一個表有一對多的關係。我想確保「一邊」的價值觀在「多」一邊是無處可去的。

編輯第二部分:我做了這樣的事情,並沒有任何運氣,因爲從第1列中的值,仍處於COLUMN_2,或column_3,或column_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)); 
+3

閱讀關於NOT EXISTS:https://msdn.microsoft.com/en-CA/library/ms188336.aspx?f=255&MSPPError=-2147217396 –

+0

IN與'其中一個值'同義' – maSTAShuFu

+0

你是什麼意思「IN與其中一個數值是同義的」?你能否更清楚一點? – LunchBox

回答

2

我想要做的是確保第1列中的每個值都不存在於第2列中的任何位置。例如,如果我的表有100行,我想確保第1,2,3行中沒有[第1列]值等出現在列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 

如果你想有一個更清潔的方式做到這一點,沒有那麼多的工會,不是解決您的方案,因爲這是一個薄弱的模式設計。一個更好的模式將只有兩列用於關鍵數據,第三列指示該記錄指出哪個關係(列)。

+0

基本上,我有一個表,我試圖確保列1中的值不顯示在任何位置在同一張表的第2,3,4或5列。 – LunchBox

+0

這是一個與你在問題中描述的**非常**不同的問題!它仍然不清楚!清楚地理解和溝通需求是編程的核心**。無論如何,對於每一行,您是否檢查所有行**和**所有行,或只檢查同一行內的所有列?如果是後者,你是否還需要確保2,3,4列等是唯一的? –

+0

我很抱歉。我試圖從我的表中查找第2,3,4和5列沒有來自第1列的任何值的行,而不管行值在哪裏。那有意義嗎? – LunchBox