I have 2 C# datatable:
Datatable A:
id
Name
Age
Height
01
Pauls
22
170
02
Sam
20
175
03
Mike
20
175
04
Jame
23
180
Datatable B:
id
Height
Age
01
175
23
02
190
21
The question here is how could I get this output by join 2 table A & B by id and get output datatable using Linq in C# OutputTable:
id
Name
Age
Height
01
Pauls
23(value in table B)
175 (value in table B)
02
Sam
21(value in table B)
190 (value in table B)
03
Mike
20
175
04
Jame
23
180
My code here:
var results = from ta in tableA.AsEnumerable()
join tb in tableB.AsEnumerable on ta["id"] equals tb["id"]
select new
{
ta["id"],
ta["Name"],
tb["Age"],
tb["Height"]
};
My output so far (not what I expected):
id
Name
Age
Height
01
Pauls
23(value in table B)
175 (value in table B)
02
Sam
21(value in table B)
190 (value in table B)
P/s: above table is just an example data, true data is bigger
INNER JOIN works as filter if record not found on the right side. You have to use LEFT JOIN here, which is implemented in LINQ as GroupJoin with SelectMany:
var results = from ta in tableA
join tb in tableB on ta.id equals tb.id into g
from tb in g.DefaultIfEmpty()
select new
{
ta.id,
ta.Name,
Age = tb != null ? tb.Age : ta.Age,
Height = tb != null ? tb.Height : ta.Height,
};
Could you try something like this:
var results = from ta in tableA
join tb in tableB on ta.id equals tb.id into gj
from subTableA in gj.DefaultIfEmpty()
select new
{
id = ta.id,
Name = ta.Name,
Age = (subTableA == null ? ta.Age : tb.Age + "(value in table B)"),
Height = (subTableA == null ? ta.Height : tb.Height + "(value in table B)")
};
Here is some page about left join using Entity Framework - https://learn.microsoft.com/en-us/dotnet/csharp/linq/perform-left-outer-joins
Idea is to introduce row 'from subTableA in gj.DefaultIfEmpty()' in order to get all rows from the join, even those which don't have matching value in second table.
If I understand the question correctly, you want to get back a DataTable from your LINQ query. However, LINQ returns an IEnumerable<T> or an IQueryable<T> if you're querying a database.
If you want a DataTable, you'll need some additional code. I suggest you refer to the top answer on this StackOverflow question, which provides a solution for converting an IEnumerable to a DataTable.
how can I display same column twice in a table but with different data using sql?
I have 3 tables tbstu, tbexm, tbscr
tbstu = stucod int PK, stunam var(100)
tbexm = exmcod int PK, exmnam var(100)
tbscr = scrcod int PK, scrsub var(100), scrach int
scrstucod int FK (to table tbstu)
screxmcod int FK (to table tbexm)
qry =
select scrcod, screxmcod, scrstucod, scrsub, scrach, scrach
from tbscr, tbstu, tbexm
where scrstucod = stucod
and screxmcod = exmcod
and stucod = 101
and exmcod = 1001
now I want the second scrach in select to display data with respect to exmcod=1002 and Total columns to sum scrach and scrach
If i understood correctly,
Use Left Join:
select
tbscr1.scrcod,
tbscr2.scrcod ,
tbscr1.screxmcod,
tbscr2.screxmcod,
tbscr1.scrstucod
tbscr2.scrstucod,
tbscr1.scrsub,
tbscr2.scrsub
tbscr1.scrach,
tbscr2.scrach,
tbscr1.scrach+tbscr2.scrach AS Total
from tbstu,tbexm
left join
tbscr as tbscr1 on tbscr1.scrstucod =tbstu.stucod and tbscr1.screxmcod = tbexm.exmcod and tbstu.stucod = 101 and tbexm.exmcod =1001
left join
tbscr as tbscr2 on tbscr2 .scrstucod =tbstu.stucod and tbscr2 .screxmcod = tbexm.exmcod and tbstu.stucod = 101 and tbexm.exmcod =1002
you can also try:
select scrcod ,
screxmcod,
scrstucod,
scrsub,
scrach,
(select scrach from tbscr ,tbstu,tbexm
where scrstucod =stucod and screxmcod = exmcod and stucod = 101 and exmcod =1002) AS scrach2
from tbscr ,tbstu,tbexm
where scrstucod =stucod and screxmcod = exmcod and stucod = 101 and exmcod =1001
Based on what I understood, I think this you want to get the following for a given student:
exam information for two exams (1001 and 1002)
total score of the two exams
If that's correct, you can do something like this:
SELECT
sc1.scrcod, sc1.screxmcod, sc1.scrsub, sc1.scrach,
sc2.scrcod, sc2.screxmcod, sc2.scrsub, sc2.scrach,
COALESCE(sc1.scrach, 0) + COALESCE(sc2.scrach, 0) AS TotalScore
FROM tbstu st
LEFT JOIN tbscr sc1 ON st.stucod = sc1.scrstucod AND sc1.screxmcod = 1001 -- Exam 1 info
LEFT JOIN tbscr sc2 ON st.stucod = sc2.scrstucod AND sc2.screxmcod = 1002 -- Exam 2 info
WHERE st.stucod = 101 -- Only get info for student 101
Update
Based on your comments it looks like you want to also split the exam scores based on subject (scrsub). You can just add this field to your JOIN condition:
SELECT
st.stucod,
sc1.scrsub,
sc1.scrach,
sc2.scrach,
COALESCE(sc1.scrach,0) + COALESCE(sc2.scrach,0) AS TotalScore
FROM tbstu st
LEFT JOIN tbscr sc1 -- Exam 1 info
ON st.stucod = sc1.scrstucod AND sc1.screxmcod = 1001
LEFT JOIN tbscr sc2 -- Exam 2 info
ON st.stucod = sc2.scrstucod AND sc2.screxmcod = 1002 AND sc1.scrsub = sc2.scrsub
WHERE st.stucod = 101 -- Only get info for student 101
As coded, this query makes a few assumptions:
this will only work for exams 1001 and 1002
exam 1001 and 1002 have identical scrsub entries (i.e. 4 rows for each exam)
Let me know how that one works.
I've got a very strange behaviour in LINQ joins
I'm joining a IEnumerable collection and a view which i'm accessing through Entity Framework.
For example (numbers are column values):
Collection
1 1
1 2
View
1 3
1 4
Result of a join should be
1 1 1 3
1 1 1 4
1 2 1 3
1 2 1 4
And i get that result in T-SQL in managment studio and even using the same code in LinqPad,
but in VS i get
1 1 1 3
1 1 1 3
1 2 1 3
1 2 1 3
or
1 1 1 4
1 1 1 4
1 2 1 4
1 2 1 4
but never the correct join. I check Linq generated query through SQL Server Profiler and launched it in Managment Stuiod, and got the correct answer. Please help me to understand such very strange behaviour
var allocations = InvoicingContext.vAllocations.Where(x => auditIds.Contains(x.AuditGroupId.Value)).AsEnumerable();
var q = from a in allocations
join c in CommonCodesContext.vContainerEntity on a.ContainerId equals c.ContainerId
select new ContainerServiceModel
{
ContainerNo = a.ContainerNo,
PortATD = c.ATD,
ATA_KL = a.ServiceDate,
RateWithoutVat = a.RateWithoutVat,
DestinationCityId = c.DestinationCityId,
Quantity = 1
};
var containerServiceModels = q.ToList();
int destinationCount = containerServiceModels.Where(x => x.DestinationCityId == 14).Count();
Queries generated for Linq code (Visual Studio)
SELECT
[Extent1].[ShipperID] AS [ShipperID],
[Extent1].[CarrierId] AS [CarrierId],
[Extent1].[ShippingLineID] AS [ShippingLineID],
[Extent1].[TerminalId] AS [TerminalId],
[Extent1].[Terminal] AS [Terminal],
[Extent1].[ContainerId] AS [ContainerId],
[Extent1].[ContainerNo] AS [ContainerNo],
[Extent1].[ContTypeID] AS [ContTypeID],
[Extent1].[PortStorageDays] AS [PortStorageDays],
[Extent1].[UnloadDate] AS [UnloadDate],
[Extent1].[ATA] AS [ATA],
[Extent1].[ATD] AS [ATD],
[Extent1].[PortShipped] AS [PortShipped],
[Extent1].[IsSealed] AS [IsSealed],
[Extent1].[ATA_CY] AS [ATA_CY],
[Extent1].[ATD_CY] AS [ATD_CY],
[Extent1].[InspectionDate] AS [InspectionDate],
[Extent1].[OrderId] AS [OrderId],
[Extent1].[OrderTypeId] AS [OrderTypeId],
[Extent1].[StorageTypeId] AS [StorageTypeId],
[Extent1].[LoadRegionId] AS [LoadRegionId],
[Extent1].[LoadCityId] AS [LoadCityId],
[Extent1].[DestinationRegionId] AS [DestinationRegionId],
[Extent1].[DestinationCityId] AS [DestinationCityId],
[Extent1].[ODCYCustomer] AS [ODCYCustomer],
[Extent1].[ODCYShipped] AS [ODCYShipped],
[Extent1].[PortReturnDate] AS [PortReturnDate],
[Extent1].[IsReturnedToPort] AS [IsReturnedToPort],
[Extent1].[ODCYStorageDays] AS [ODCYStorageDays],
[Extent1].[DetentionDays] AS [DetentionDays],
[Extent1].[CCFinish] AS [CCFinish],
[Extent1].[FreeDaysForTrucker] AS [FreeDaysForTrucker],
[Extent1].[TruckingUnloadDays] AS [TruckingUnloadDays],
[Extent1].[TruckingEmptyReturnDays] AS [TruckingEmptyReturnDays],
[Extent1].[TruckingEmptyReturnDetentionDays] AS [TruckingEmptyReturnDetentionDays],
[Extent1].[LatePickUpDays] AS [LatePickUpDays]
FROM (SELECT
[vContainerEntity].[ShipperID] AS [ShipperID],
[vContainerEntity].[CarrierId] AS [CarrierId],
[vContainerEntity].[ShippingLineID] AS [ShippingLineID],
[vContainerEntity].[TerminalId] AS [TerminalId],
[vContainerEntity].[Terminal] AS [Terminal],
[vContainerEntity].[ContainerId] AS [ContainerId],
[vContainerEntity].[ContainerNo] AS [ContainerNo],
[vContainerEntity].[ContTypeID] AS [ContTypeID],
[vContainerEntity].[PortStorageDays] AS [PortStorageDays],
[vContainerEntity].[UnloadDate] AS [UnloadDate],
[vContainerEntity].[ATA] AS [ATA],
[vContainerEntity].[ATD] AS [ATD],
[vContainerEntity].[PortShipped] AS [PortShipped],
[vContainerEntity].[IsSealed] AS [IsSealed],
[vContainerEntity].[ATA_CY] AS [ATA_CY],
[vContainerEntity].[ATD_CY] AS [ATD_CY],
[vContainerEntity].[InspectionDate] AS [InspectionDate],
[vContainerEntity].[OrderId] AS [OrderId],
[vContainerEntity].[OrderTypeId] AS [OrderTypeId],
[vContainerEntity].[StorageTypeId] AS [StorageTypeId],
[vContainerEntity].[LoadRegionId] AS [LoadRegionId],
[vContainerEntity].[LoadCityId] AS [LoadCityId],
[vContainerEntity].[DestinationRegionId] AS [DestinationRegionId],
[vContainerEntity].[DestinationCityId] AS [DestinationCityId],
[vContainerEntity].[ODCYCustomer] AS [ODCYCustomer],
[vContainerEntity].[ODCYShipped] AS [ODCYShipped],
[vContainerEntity].[PortReturnDate] AS [PortReturnDate],
[vContainerEntity].[IsReturnedToPort] AS [IsReturnedToPort],
[vContainerEntity].[ODCYStorageDays] AS [ODCYStorageDays],
[vContainerEntity].[DetentionDays] AS [DetentionDays],
[vContainerEntity].[CCFinish] AS [CCFinish],
[vContainerEntity].[FreeDaysForTrucker] AS [FreeDaysForTrucker],
[vContainerEntity].[TruckingUnloadDays] AS [TruckingUnloadDays],
[vContainerEntity].[TruckingEmptyReturnDays] AS [TruckingEmptyReturnDays],
[vContainerEntity].[TruckingEmptyReturnDetentionDays] AS [TruckingEmptyReturnDetentionDays],
[vContainerEntity].[LatePickUpDays] AS [LatePickUpDays]
FROM [Tariff].[vContainerEntity] AS [vContainerEntity]) AS [Extent1]
and
SELECT
[Extent1].[id] AS [id],
[Extent1].[Payer] AS [Payer],
[Extent1].[Receiver] AS [Receiver],
[Extent1].[CustomerId] AS [CustomerId],
[Extent1].[CustomerName] AS [CustomerName],
[Extent1].[AuditGroupId] AS [AuditGroupId],
[Extent1].[ContainerId] AS [ContainerId],
[Extent1].[OrderId] AS [OrderId],
[Extent1].[ContainerNo] AS [ContainerNo],
[Extent1].[TariffId] AS [TariffId],
[Extent1].[ServiceTypeId] AS [ServiceTypeId],
[Extent1].[ServiceType] AS [ServiceType],
[Extent1].[ServiceDate] AS [ServiceDate],
[Extent1].[IsServiceDateClosed] AS [IsServiceDateClosed],
[Extent1].[InvoiceId] AS [InvoiceId],
[Extent1].[InvoiceNo] AS [InvoiceNo],
[Extent1].[InvoiceDate] AS [InvoiceDate],
[Extent1].[ReceiveDate] AS [ReceiveDate],
[Extent1].[DueDate] AS [DueDate],
[Extent1].[ResponsibleUser] AS [ResponsibleUser],
[Extent1].[Free] AS [Free],
[Extent1].[PaymentQty] AS [PaymentQty],
[Extent1].[RateWithoutVat] AS [RateWithoutVat],
[Extent1].[RateWithVat] AS [RateWithVat],
[Extent1].[AmountWithoutVat] AS [AmountWithoutVat],
[Extent1].[CommissionWithoutVat] AS [CommissionWithoutVat],
[Extent1].[TotalAmountWithoutVat] AS [TotalAmountWithoutVat],
[Extent1].[AmountWithVat] AS [AmountWithVat],
[Extent1].[CommissionWithVat] AS [CommissionWithVat],
[Extent1].[TotalAmountWithVat] AS [TotalAmountWithVat],
[Extent1].[VatSum] AS [VatSum],
[Extent1].[RateWithoutVatRub] AS [RateWithoutVatRub],
[Extent1].[RateWithVatRub] AS [RateWithVatRub],
[Extent1].[AmountWithoutVatRub] AS [AmountWithoutVatRub],
[Extent1].[CommissionAmountWithoutVatInRub] AS [CommissionAmountWithoutVatInRub],
[Extent1].[TotalAmountWithoutVatRub] AS [TotalAmountWithoutVatRub],
[Extent1].[AmountWithVatRub] AS [AmountWithVatRub],
[Extent1].[CommissionAmountWithVatInRub] AS [CommissionAmountWithVatInRub],
[Extent1].[TotalAmountWithVatRub] AS [TotalAmountWithVatRub],
[Extent1].[AmountVatRub] AS [AmountVatRub],
[Extent1].[CommissionVatRub] AS [CommissionVatRub],
[Extent1].[VatSumInRub] AS [VatSumInRub],
[Extent1].[CurrencyId] AS [CurrencyId],
[Extent1].[IncludeVat] AS [IncludeVat],
[Extent1].[VAT] AS [VAT],
[Extent1].[IncludeVatInCommission] AS [IncludeVatInCommission],
[Extent1].[ExchangeDate] AS [ExchangeDate],
[Extent1].[ExchangeDateForCommission] AS [ExchangeDateForCommission],
[Extent1].[ExchangeRate] AS [ExchangeRate],
[Extent1].[CommissionExchangeRate] AS [CommissionExchangeRate],
[Extent1].[AverageExchangeRate] AS [AverageExchangeRate],
[Extent1].[StatusId] AS [StatusId],
[Extent1].[Remark] AS [Remark],
[Extent1].[Author] AS [Author],
[Extent1].[DtCreated] AS [DtCreated]
FROM (SELECT
[vAllocations].[id] AS [id],
[vAllocations].[Payer] AS [Payer],
[vAllocations].[Receiver] AS [Receiver],
[vAllocations].[CustomerId] AS [CustomerId],
[vAllocations].[CustomerName] AS [CustomerName],
[vAllocations].[AuditGroupId] AS [AuditGroupId],
[vAllocations].[ContainerId] AS [ContainerId],
[vAllocations].[OrderId] AS [OrderId],
[vAllocations].[ContainerNo] AS [ContainerNo],
[vAllocations].[TariffId] AS [TariffId],
[vAllocations].[ServiceTypeId] AS [ServiceTypeId],
[vAllocations].[ServiceType] AS [ServiceType],
[vAllocations].[ServiceDate] AS [ServiceDate],
[vAllocations].[IsServiceDateClosed] AS [IsServiceDateClosed],
[vAllocations].[InvoiceId] AS [InvoiceId],
[vAllocations].[InvoiceNo] AS [InvoiceNo],
[vAllocations].[InvoiceDate] AS [InvoiceDate],
[vAllocations].[ReceiveDate] AS [ReceiveDate],
[vAllocations].[DueDate] AS [DueDate],
[vAllocations].[ResponsibleUser] AS [ResponsibleUser],
[vAllocations].[Free] AS [Free],
[vAllocations].[PaymentQty] AS [PaymentQty],
[vAllocations].[RateWithoutVat] AS [RateWithoutVat],
[vAllocations].[RateWithVat] AS [RateWithVat],
[vAllocations].[AmountWithoutVat] AS [AmountWithoutVat],
[vAllocations].[CommissionWithoutVat] AS [CommissionWithoutVat],
[vAllocations].[TotalAmountWithoutVat] AS [TotalAmountWithoutVat],
[vAllocations].[AmountWithVat] AS [AmountWithVat],
[vAllocations].[CommissionWithVat] AS [CommissionWithVat],
[vAllocations].[TotalAmountWithVat] AS [TotalAmountWithVat],
[vAllocations].[VatSum] AS [VatSum],
[vAllocations].[RateWithoutVatRub] AS [RateWithoutVatRub],
[vAllocations].[RateWithVatRub] AS [RateWithVatRub],
[vAllocations].[AmountWithoutVatRub] AS [AmountWithoutVatRub],
[vAllocations].[CommissionAmountWithoutVatInRub] AS [CommissionAmountWithoutVatInRub],
[vAllocations].[TotalAmountWithoutVatRub] AS [TotalAmountWithoutVatRub],
[vAllocations].[AmountWithVatRub] AS [AmountWithVatRub],
[vAllocations].[CommissionAmountWithVatInRub] AS [CommissionAmountWithVatInRub],
[vAllocations].[TotalAmountWithVatRub] AS [TotalAmountWithVatRub],
[vAllocations].[AmountVatRub] AS [AmountVatRub],
[vAllocations].[CommissionVatRub] AS [CommissionVatRub],
[vAllocations].[VatSumInRub] AS [VatSumInRub],
[vAllocations].[CurrencyId] AS [CurrencyId],
[vAllocations].[IncludeVat] AS [IncludeVat],
[vAllocations].[VAT] AS [VAT],
[vAllocations].[IncludeVatInCommission] AS [IncludeVatInCommission],
[vAllocations].[ExchangeDate] AS [ExchangeDate],
[vAllocations].[ExchangeDateForCommission] AS [ExchangeDateForCommission],
[vAllocations].[ExchangeRate] AS [ExchangeRate],
[vAllocations].[CommissionExchangeRate] AS [CommissionExchangeRate],
[vAllocations].[AverageExchangeRate] AS [AverageExchangeRate],
[vAllocations].[StatusId] AS [StatusId],
[vAllocations].[Remark] AS [Remark],
[vAllocations].[Author] AS [Author],
[vAllocations].[DtCreated] AS [DtCreated]
FROM [dbo].[vAllocations] AS [vAllocations]) AS [Extent1]
WHERE ([Extent1].[AuditGroupId] IN (9107)) AND ([Extent1].[AuditGroupId] IS NOT NULL)
Queries generated on LinqPAD test
exec sp_executesql N'SELECT [t0].[ContainerNo], [t1].[ATD] AS [PortATD], [t0].[ServiceDate] AS [ATA_KL], [t0].[RateWithoutVat], [t1].[DestinationCityId]
FROM [Invoicing_SPB].[dbo].[vAllocations] AS [t0]
INNER JOIN [Tariff].[vContainerEntity] AS [t1] ON ([t0].[ContainerId]) = [t1].[ContainerId]
WHERE ([t1].[DestinationCityId] = #p0) AND ([t0].[AuditGroupId] = #p1)',N'#p0 int,#p1 int',#p0=14,#p1=9107
I've tried to loop and get count of result collection dependting on predicate
Invoicing_SPBEntities invContext = new Invoicing_SPBEntities();
CommonCodesEntities ccContext = new CommonCodesEntities();
for (int i = 0; i <= 20; i++)
{
var allocations = (from a in invContext.vAllocations
where a.AuditGroupId == 9107
select a).AsEnumerable();
var q = from a in allocations
join c in ccContext.vContainerEntity on a.ContainerId equals c.ContainerId
select new
{
ContainerNo = a.ContainerNo,
PortATD = c.ATD,
ATA_KL = a.ServiceDate,
RateWithoutVat = a.RateWithoutVat,
OrderTypeId = c.OrderTypeId,
DestinationCityId = c.DestinationCityId,
Quantity = 1
};
var result = q.ToList();
Console.WriteLine(result.Where(x=>x.DestinationCityId == 14).ToList().Count);
}
Resulting console output
64
62
58
58
64
62
60
60
56
60
62
60
58
54
56
64
58
Very strange :D
I have the following tables:
*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]
From this query:
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' )
I get the following result
id idIndice valor
13 11 11111111
13 12 22222
14 11 11111111
14 12 22222
16 12 22222
As you can see, I want all ids with idIndice 11 with value 11111111 and 12 with value 22222
Id 16 has id 12 with value 22222 authough it does not have id 11 with value 11111111 so I donĀ“t want it to be shown.
How can I update my query to obtain the result I want. Hope my question is clear. If it is not just ask and I edit my post. Thanks
I would suggest something like this:
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
So... get all the results from your first query where there is at least one result from the table that matches on id, but does not match on valor. (This assumes you could have duplicate rows with the same valor, but you wouldn't want that.)
Try something like this. I took out the tables that didn't have direct bearing on the query, although I named them similarly, and I created a simple schema to replicate the problem. I hope this is clear, and that the connection back to your original query is likewise clear.
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')
The important part of the code is the INTERSECT - it returns only rows that are in both sets. In my experience this operator is usually more efficient than anything containing an OR. In the query below, we are getting only those Indexacao rows whose idDocumentos are in the INTERSECT of the two sets of conditions.
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
This assumes that you don't have duplicate Indice, Valor rows for a single idDocumento - if you do, you will need to add a DISTINCT.