我有两张表,Document
和DocumentField
定义如下。
文档(仅为简洁起见,相关专栏):
DocumentKey - char(36)
DocTypeKey - char(36)
DocumentField :
DocumentKey - char(36)
FieldId - varchar(10)
FieldValue - varchar(255)
DocumentKey
和DocTypeKey
值是标准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
我能找到我想要的结果吗?
答案 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%'
)