0

我有以下表格:

*sistema_documentos*

[id], [caminho], [idDocType](FK -> sistema_DocType.id)

*sistema_Indexacao*

[id] ,[idDocumento](FK -> sistema_documentos.id) ,[idIndice](FK -> sistema_Indexes) ,[valor]

*sistema_DocType*

[id], [tipoNome](FK -> sistema_DocType.id)

*sistema_DocType_Index*

[id],[idName],[面具],[idTipo](FK -> sistema_DocType.id),[tamanho]

从这个查询

select distinct a.id, b.idIndice, b.valor from tgpwebged.dbo.sistema_Documentos as a
join tgpwebged.dbo.sistema_Indexacao as b on a.id = b.idDocumento
join tgpwebged.dbo.sistema_DocType as c on a.idDocType = c.id
join tgpwebged.dbo.sistema_DocType_Index as d on c.id = d.docTypeId
where d.docTypeId = 40 
and (b.idIndice = 11 AND b.valor = '11111111' OR b.idIndice = 12 AND b.valor = '22222' )

我得到以下结果

id  idIndice    valor
13  11          11111111
13  12          22222
14  11          11111111
14  12          22222
16  12          22222

如您所见,我想要所有 idIndice 11 的 id 值为 11111111 和 12 的值为 22222

ID 16 的 id 12 的值为 22222 authough 它没有 id 11 的值为 11111111 所以我不希望它显示出来。

如何更新我的查询以获得我想要的结果。希望我的问题很清楚。如果它不只是问,我编辑我的帖子。谢谢

4

2 回答 2

1

我会建议这样的事情:

WITH TempTable AS 
( 
    select distinct a.id, b.idIndice, b.valor  
    from tgpwebged.dbo.sistema_Documentos as a  
        join tgpwebged.dbo.sistema_Indexacao as b on a.id = b.idDocumento 
    join tgpwebged.dbo.sistema_DocType as c on a.idDocType = c.id
    join tgpwebged.dbo.sistema_DocType_Index as d on c.id = d.docTypeId 
    where d.docTypeId = 40      
        and (b.idIndice = 11 AND b.valor = '11111111' OR b.idIndice = 12 AND b.valor = '22222' ) 
)

SELECT *  
FROM TempTable t1 
WHERE (select count(*)          
       from TempTable t2        
       where t1.id = t2.id AND t1.valor != t2.valor) = 1

所以...从您的第一个查询中获取所有结果,其中至少有一个表中的结果与 id 匹配,但与 valor 不匹配。(这假设您可以拥有具有相同价值的重复行,但您不希望这样。)

于 2012-12-20T17:01:05.533 回答
0

尝试这样的事情。我取出了与查询没有直接关系的表,尽管我以类似方式命名它们,并创建了一个简单的模式来复制问题。我希望这很清楚,并且与原始查询的联系也很清楚。

CREATE TABLE Documentos (ID INT, document varchar(12))
create table Indexacao (AID INT, indice int, valor varchar(12))

insert Documentos(id, document)
values (1, 'test1'),
        (2, 'test2'),
        (3, 'test3')

insert Indexacao (aid, indice, valor)
values (1, 11, '11111111'),
        (1, 12, '22222'),
        (2, 12, '22222')

代码的重要部分是 INTERSECT - 它只返回两个集合中的行。以我的经验,这个操作符通常比任何包含OR. 在下面的查询中,我们只得到那些 idDocumentos 在INTERSECT两组条件中的 Indexacao 行。

SELECT Ind.*
FROM Indexacao Ind
JOIN (
    SELECT  D.ID
    FROM    Documentos  D
    JOIN    Indexacao   I
    ON      D.ID = I.AID
    WHERE   I.Indice = 11 AND I.valor = '11111111'
    INTERSECT
    SELECT  D.ID
    FROM    Documentos  D
    JOIN    Indexacao   I
    ON      D.ID = I.AID
    WHERE   I.Indice = 12 AND I.valor = '22222'
    )Doc (ID)
ON  Doc.ID = Ind.AID    

这假设您没有针对单个 idDocumento 重复的 Indice、Valor 行 - 如果有,则需要添加 DISTINCT。

于 2012-12-20T17:39:46.740 回答