我在一个Access DB中有三个表。
Labs (ID, TestLab)
Standards (ID, Standard, Keywords)
LabStd (ID, LabID, StdID)实验室有很多标准。在今天之前,我所需要做的就是将搜索短语与Standards表中的关键字或标准列进行匹配。
Select Labs.ID, Labs.TestLab, Standards.standard
FROM Standards INNER JOIN (Labs INNER JOIN LabStd
ON Labs.ID = LabStd.LabID)
ON Standards.ID = LabStd.StdID
WHERE Standards.Keywords LIKE "%labstandard%"
OR Standards.standard LIKE "%labstandard%"
ORDER BY Labs.id, Standards.ID现在,如果在搜索中使用加号(labstandard1+labstandard2),我需要拆分字符串,并查看实验室是否匹配搜索中的所有标准。我想我需要为此使用子查询,并尝试使用多个WHERE IN语句,但这不起作用,因此我感到困惑。
作为测试,我删除了LIKE语句,只使用equals。下面的查询不返回任何结果,即使每个标准都有匹配的标准,也有与这两个标准相关联的实验室。
SELECT Labs.ID, Labs.TestLab, Standards.standard
FROM Standards INNER JOIN (Labs INNER JOIN LabStd
ON Labs.ID = LabStd.LabID)
ON Standards.ID = LabStd.StdID
WHERE LabStd.StdID IN
(SELECT ID AS StdID FROM Standards
WHERE (Standards.Keywords = 'labstandard1'
OR Standards.standard ='labstandard1')
)
AND LabStd.StdID IN
(SELECT ID as StdID
FROM Standards
WHERE (Standards.Keywords = 'labstandard2'
OR Standards.standard ='labstandard2')
)
ORDER BY Labs.id, Standards.ID我希望我已经解释得足够清楚了,如果我需要澄清什么,请告诉我。
发布于 2012-02-23 00:20:26
最后一个查询的问题是,您要查找两个子集都有StdId的单个LabStd行,而这是不可能的。您想要的是找到这两个标准都存在的所有实验室。像这样的东西:
SELECT
*
FROM
Labs
WHERE
EXISTS (
SELECT
1
FROM
LabStd INNER JOIN Standards ON LabStd.StdId = Standards.Id
WHERE
LabStd.LabId = Labs.Id
AND
( Standards.Standard = 'labstandard1' or Standards.Keywords = 'labstandard1' )
)
AND
EXISTS (
SELECT
1
FROM
LabStd INNER JOIN Standards ON LabStd.StdId = Standards.Id
WHERE
LabStd.LabId = Labs.Id
AND
( Standards.Standard = 'labstandard2' or Standards.Keywords = 'labstandard2' )
)发布于 2012-02-22 06:28:12
像这样的东西可能是,尽管standard.keywords建议这应该是一种类似于...
Select ID as StdID From Standards Where
Standards.Keywords ='labstandard1'
OR
Standards.standard = "labstandard1"
OR
Standards.Keywords ='labstandard2'
OR
Standards.standard = "labstandard2"然后使用All获取labstd
select LabStd.LabID
Where StdId = all (Select ID as StdID From Standards Where
Standards.Keywords ='labstandard1'
OR
Standards.standard = "labstandard1"
OR
Standards.Keywords ='labstandard2'
OR
Standards.standard = "labstandard2")然后回到实验室。
像这样的查询会让你发疯。一定要从里到外把它们拆开,并确认零件。
发布于 2012-02-23 00:04:27
我已经找到了一个解决方案,尽管它非常丑陋。首先是一些数据。
**Standards**
ID Standard Keywords
20 AAMA 505 Dry Shrinkage Thermal Cycling
26 AAMA 614 High Perf. Organic Coatings on Plastic
**Labs**
ID TestLab
10 TESTING, INC
21 LABORATORIES, INC.
3 FRESNO TESTING, INC.
**LabStd**
ID LabID StdID
283 3 20
284 10 20
285 21 20
291 21 26
299 10 26下面是一个有效的查询。这将拉出实验室is 10和21,并省略3,这是正确的。
SELECT Labs.ID, Labs.TestLab, Standards.standard
FROM Standards INNER JOIN (Labs INNER JOIN LabStd
ON Labs.ID = LabStd.LabID)
ON Standards.ID = LabStd.StdID
WHERE LabStd.StdID IN
(
SELECT labs.testlab
FROM Standards INNER JOIN
(Labs INNER JOIN LabStd ON Labs.ID = LabStd.LabID)
ON Standards.ID = LabStd.StdID
WHERE standards.standard = "AAMA 505"
)
AND Labs.TestLab IN
(
SELECT labs.testlab
FROM Standards INNER JOIN
(Labs INNER JOIN LabStd ON Labs.ID = LabStd.LabID)
ON Standards.ID = LabStd.StdID
WHERE standards.standard = "AAMA 614"
)
ORDER BY Labs.id, Standards.IDhttps://stackoverflow.com/questions/9385928
复制相似问题