2017-08-30 91 views
2

我有3個表SQL - 檢查是否在列表中的值不存在表中,並返回布爾相應

用戶
ID

matricule

組成一個簡單的數據庫模式

文檔
id
serial

User_Document(連接表)
user_id說明
DOCUMENT_ID

我要檢查,如果在連接表(User_Document)存在列表(Document.serial列表)的所有項目,然後返回true 如果至少一個不存在,它應該返回false

還有就是我當前查詢

SELECT CASE WHEN EXISTS (
SELECT * 
FROM user_document ud 
INNER JOIN document d ON d.id= ud.document_id 
INNER JOIN user u ON u.id = ud.user_id 
where u.matricule='123' 
and d.serial in ('#1' ,'#2' , '#3') 
) 
THEN TRUE 
ELSE FALSE 
END 

這不起作用,因爲它會回報總是正確的,即使列表的一個項目並不在連接表中存在

我的PostgreSQL

非常感謝您

+0

'我想檢查文檔序列表的所有項是否存在於......'你的意思是:如果一個元素不存在(但其他元素),它應該返回False?請重新說明... – wildplasser

+0

@Wildplasser。對,就是那樣 。謝謝 – ulquiorra

回答

1

聚合連續在一個陣列,並與所期望的連續的排列比較:

SELECT ARRAY(SELECT d.serial 
      FROM user_document ud 
      JOIN document d ON d.id = ud.document_id 
      JOIN "user" u ON u.id = ud.user_id 
      WHERE u.matricule = '123') @> ARRAY['#1', '#2', '#3']::varchar[]; 

注意,我必須在查詢中引用的表名user,因爲它是PostgreSQL中的reserved key word和SQL標準。

另一種方法是計數明顯連續匹配列表,並檢查計數列表的長度相匹配:

SELECT count(DISTINCT d.serial) = 3 
FROM user_document ud 
JOIN document d ON d.id= ud.document_id 
JOIN "user" u ON u.id = ud.user_id 
WHERE u.matricule='123' AND d.serial IN ('#1','#2','#3'); 

此版本還與不支持數組(如MySQL)數據庫的工作原理,並且如果有大量與用戶相關的文檔,則效率可能更高。

+0

謝謝,但我得到了一個「操作符不存在:character varying [] @> text []。沒有操作符與給定的名稱和參數類型匹配,您可能需要添加顯式類型轉換。」:( – ulquiorra

+0

已添加強制轉換爲'varchar []',請重試。您可以使用完整的DDL爲您的模式更新您的問題,包括每列的類型嗎? – markusk

+0

它很好用,非常感謝:) – ulquiorra

2
SELECT 
D.*, 
(CASE WHEN (SELECT 1 FROM USER_DOCUMENT 
WHERE D.ID = UD.DOCUMENT_ID LIMIT 1) = 1 THEN TRUE ELSE FALSE END) 
FROM DOCUMENT D 
+0

我需要比較一個現有的文檔序列列表中不是所有文檔中的條目。謝謝 – ulquiorra

2

試試這個:

 SELECT bool_and(ud.document_id is not null) as all_match, 
      bool_or(ud.documnet_id is not null) as at_least_one_matches 
     FROM document d 
    LEFT JOIN user_document ud ON d.id = ud.document_id; 

這應該經過,做一個左連接,並返回true,如果全部匹配,並且假如果一個不匹配。如果至少有一個匹配,第二個返回true。

如果你想笑

+0

這幾乎是我想要的結果,除了我想通過定義的文檔ID列表而不是整個表格(如我的示例所示) 非常感謝 – ulquiorra

+0

然後添加where子句。聚合在沒有被where子句排除的行上工作。 –

相關問題