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]、[mask]、[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

ご覧のとおり、値11111111のidIndice11と値22222の12のすべてのIDが必要です。

ID16には値22222のID12がありますが、値11111111のID 11がないため、表示されたくありません。

クエリを更新して、必要な結果を取得するにはどうすればよいですか。私の質問が明確であることを願っています。質問するだけでなく、投稿を編集する場合。ありがとう

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には一致しないテーブルからの結果が少なくとも1つあります。(これは、同じ値の行が重複している可能性があることを前提としていますが、それは望ましくありません。)

于 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が2つの条件セットのいずれかにあるIndexacao行のみを取得していINTERSECTます。

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 に答える