SQL SELECT查询帮助

时间:2012-07-22 21:30:00

标签: sql sql-server

我有两张表,DocumentDocumentField定义如下。

文档(仅为简洁起见,相关专栏):

DocumentKey - char(36)
DocTypeKey - char(36)

DocumentField

DocumentKey - char(36)
FieldId - varchar(10)
FieldValue - varchar(255)

DocumentKeyDocTypeKey值是标准GUID。 FieldId主要是数字1到30的字符串值(还有其他几个非数字值,因此它是varchar列的原因)。 FieldValue只是一个字符串值,可以是任何内容。

Document的示例数据为:

DocKey | DocTypeKey  
A      | X  
B      | Y  
C      | Z  

DocumentField中的示例数据将是:

DocKey | FieldId | FieldValue  
A      | 1       | PO1234  
A      | 2       | INV1234  
B      | 1       | PO5678  
B      | 2       | INV5678 
C      | 1       | PO1234
C      | 2       | INV2345 

我正在尝试运行的查询是:

SELECT * 
FROM Document 
INNER JOIN DocumentField ON Document.DocumentKey = DocumentField.DocumentKey 
WHERE  (DocTypeKey IS NOT NULL) AND (FieldId = '1' AND FieldValue LIKE 'PO1%') AND (FieldId = '2' AND FieldValue LIKE 'INV1%') 

但是当我添加AND (FieldId = '2' AND FieldValue LIKE 'INV%')部分时,我没有得到结果。它只适用于第一个WHERE (DocTypeKey IS NOT NULL) AND (FieldId = '1' AND FieldValue LIKE 'PO%')部分。鉴于上面的示例数据,我希望它返回:

DocKey | DocTypeKey
A      | X

我能找到我想要的结果吗?

5 个答案:

答案 0 :(得分:3)

您需要使用子查询检查每个文档。我能想到的最好的是:

select d.* from Document d
where d.DocTypeKey is not null
and (
    select count(*) = 2 from DocumentField df
    where df.DocKey = d.DocKey
    and (
        (df.FieldId = '1' and df.FieldValue like 'PO1%')
        or (df.FieldId = '2' and df.FieldValue like 'INV1%')));

count(*) = 2中,您必须在子选择中使用FieldId + FieldValue条件的数量。

以下是包含您数据的ideone示例:http://ideone.com/uURwu。 ideone使用SQLite,我在H2中开发了这个,但SQL Server语法应该是相同的。

答案 1 :(得分:1)

你可能想要OR(FieldId ='2'和FieldValue LIKE'INV1%')

你不能有FieldId ='1'和FieldId ='2'

答案 2 :(得分:1)

我想你想要这个:

WHERE  (DocTypeKey IS NOT NULL) 
AND ((FieldId = '1' AND FieldValue LIKE 'PO1%') OR (FieldId = '2' AND FieldValue LIKE 'INV1%'))

答案 3 :(得分:1)

当其他答案陈述时,你不能有一行其中FieldId ='1'AND FieldId ='2'。

但是,我将不同意OR的其他答案使用 - 您似乎想要找到具有相应FieldValues的FieldId为1和2的单个Document行。所以OR不会得到你想要的东西 - 你需要使用一个子选择:

SELECT Document.DocKey, Document.DocTypeKey
FROM Document 
INNER JOIN DocumentField ON Document.DocKey = DocumentField.DocKey 
WHERE  Document.DocTypeKey IS NOT NULL 
  AND DocumentField.FieldId = '1' AND DocumentField.FieldValue LIKE 'PO1%'
  AND  Document.DocKey = (SELECT DocumentField.DocKey FROM DocumentField WHERE DocumentField.FieldId = '2' AND DocumentField.FieldValue LIKE 'INV1%')

答案 4 :(得分:0)

感谢大家的建议。我最终得到的是与Brian S和millimoose的答案相同的行,使用每个附加标准的子选择。

SELECT Document.* 
FROM Document 
INNER JOIN DocumentField ON Document.DocumentKey = DocumentField.DocumentKey 
WHERE  (DocTypeKey IS NOT NULL) 
AND Document.DocumentKey IN (
    SELECT DocumentKey FROM DocumentField WHERE FieldId = '1' AND FieldValue  LIKE 'PO1%' 
    INTERSECT 
    SELECT DocumentKey FROM DocumentField WHERE FieldId = '2' AND FieldValue  LIKE 'INV1%'
)