Strange LINQ joins - c#
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
Related
Selecting 7th Person (row) and get 7 as result
I want to select the 7th person (Pierre Gasly (for example)) Score list Season F1, so I can return number 7 in my C# application. SELECT CONCAT(strVoorNaam, strTussenVoegsel, ' ', strAchterNaam) AS Naam, SUM(CAST(tblPunten.strScore AS INT)) AS score FROM tblPunten JOIN tblPuntenCoureur ON tblPuntenCoureur.PuntenID = tblPunten.ID JOIN tblPersoon ON tblPersoon.ID = tblPuntenCoureur.PersoonID JOIN tblSeizoen ON tblSeizoen.ID = tblPuntenCoureur.SeizoenID WHERE tblPunten.ID != 12 AND tblPunten.ID != 13 AND tblPunten.ID != 14 AND tblPunten.ID != 15 AND tblPunten.ID != 16 AND tblPunten.ID != 17 AND tblPunten.ID != 18 AND tblPunten.ID != 19 AND tblSeizoen.intJaartal = 2019 GROUP BY CONCAT(strVoorNaam, strTussenVoegsel, ' ', strAchterNaam), tblPersoon.strAchterNaam ORDER BY score DESC
Use a row limiting clause: select concat(strvoornaam, strtussenvoegsel, ' ', strachternaam) as naam, sum(cast(pu.strscore as int)) as score from tblpunten pu join tblpuntencoureur pc on pc.puntenid = pu.id join tblpersoon pe on pe.id = pc.persoonid join tblseizoen se on se.id = pc.seizoenid where pu.id not between 12 and 19 and se.intjaartal = 2019 group by strvoornaam, strtussenvoegsel, strachternaam, pe.strachternaam order by score desc offset 6 rows fetch next 1 row only This gives you the seventh row in the resultset. Side notes: table aliases help keeping the query concise and easier to write you should be qualifying all columns that come into play in the query On the other hand, if you are trying to get the rank of a specific person, then that's different. You can use rank() instead: select * from ( select concat(strvoornaam, strtussenvoegsel, ' ', strachternaam) as naam, sum(cast(pu.strscore as int)) as score, rank() over(order by sum(cast(pu.strscore as int)) desc) rn from tblpunten pu join tblpuntencoureur pc on pc.puntenid = pu.id join tblpersoon pe on pe.id = pc.persoonid join tblseizoen se on se.id = pc.seizoenid where pu.id not between 12 and 19 and se.intjaartal = 2019 group by strvoornaam, strtussenvoegsel, strachternaam, pe.strachternaam ) t where naam = 'Pierre Gasly'
SQL hiearchy select query between two tables
I have 2 tables (People, Department). Department table look like this: ID (int) Name (varchar) ParentID (int) People table like this: Id (int) FirstName (varchar) SureName (varchar) DepartmentId (int) Manager (Bool) Asistant (Bool) I need to create query, which select all direct subordinates of concrete person which is manager of concrete depertment. And one query which select all not only direct subordinates of manager. Each department have one manager and one asistant. The peoples with manager == false are direct subordinates, and peoples in child depertment are subordinates of parent depratment . I have no idea how to crete this queries in SQL / LINQ. I will be grateful for any help! Example: DEPARTMENT Id Name Parent 0 Department1 null 1 Department2 0 2 Department3 1 Example: People ID Name Department DepartmentId Manager Asistant 1 Martin Joshua 0 1 0 2 Ondra Joshua2 0 0 0 3 Petr Joshua3 0 0 0 4 Todd Joshua3 1 1 0 5 Alex Joshua3 1 0 0 6 Iva Joshua3 1 0 0 7 Otto Joshua3 2 1 0 8 Todd Joshua3 2 0 0 I need for exmple select all (not only direct) subordinates of manager in deparment with id 0, result wil look like: 2 Ondra Joshua2 0 0 0 3 Petr Joshua3 0 0 0 4 Todd Joshua3 1 1 0 5 Alex Joshua3 1 0 0 6 Iva Joshua3 1 0 0 7 Otto Joshua3 2 1 0 8 Todd Joshua3 2 0 0 I´m not sure direct subordinates SQL query: SELECT * FROM dbo.PeopleView WHERE DepartmentId = 162 AND Manager = 0; -- all direct s (162) SOLUTION: ;WITH CTE AS ( SELECT 1 as EMPLEVEL, H1.Id, H1.ParentId, H1.Name FROM DepartmentView H1 WHERE Id = 6 UNION ALL SELECT EMPLEVEL + 1, H2.Id, H2.ParentId, H2.Name FROM DepartmentView H2 INNER JOIN CTE ON H2.ParentId = CTE.Id ) SELECT DISTINCT P.Id, P.LastName,P.FirstName,P.DepartmentId,P.Manager,P.Assistant FROM CTE as T JOIN PeopleView as P on T.Id = P.DepartmentId;
In adition to your first query, and like a comment from #Andrew says, a recursive query can help with this: ;WITH CTE AS ( SELECT ID,FirstName,SureName,DepartmentID,Manager,Assistant, 0 AS EMPLEVEL FROM PEOPLE A WHERE DepartmentId = 1 AND Manager = 0 UNION ALL SELECT B.ID,B.FirstName,B.SureName,B.DepartmentID,B.Manager,B.Assistant,EMPLEVEL +1 FROM PEOPLE B INNER JOIN DEPARTMENT D ON B.DepartmentID = D.ID INNER JOIN CTE ON D.ParentID = CTE.DepartmentID ) SELECT DISTINCT * FROM CTE And for convert to LINQ, you can read this post :P: Common Table Expression (CTE) in linq-to-sql? Hope this help, best regards.
Replacing Id with Actual values in SQL Server
I have the following table structure also I have mention my expected output please help me with query as I don't know much about SQL query Query : SELECT * FROM( SELECT ESIDispensary,ESILocation,test,Category, COUNT(*) AS [Total Count] FROM (SELECT category,ESILOCATION,ESIDISPENSARY,TEST FROM(SELECT id,CompanyId,FName,Code,category,ESILOCATION,ESIDISPENSARY FROM dbo.[EmployeeDetail] e WHERE e.CompanyId = 1 AND Category in (1,2)) a LEFT JOIN (SELECT * from (SELECT EmployeeId, CustomeFieldName,FieldValue FROM dbo.[CustomeFieldDetail] C JOIN dbo.[EmployeeDetail] e ON e.id = c.employeeid AND e.CompanyId = c.companyid WHERE e.CompanyId = 1 AND Category IN (1,2)) SRC PIVOT (MAX(FieldValue) FOR CustomeFieldName IN([TEST])) piv) b ON a.Id = b.EmployeeId ) AS a GROUP BY ESIDispensary ,ESILocation,test,Category) x Table generated using above query ESIDispensary ESILocation test Category Count 12 11 NULL 1 NULL 12 13 30 1 1 14 13 29 2 2 Table 1 : ESI Id CompanyId FieldName ComboValue 11 1 ESILOCATION mumbai 12 1 ESIDISPENSARY mumbai 13 1 ESILOCATION pune 14 1 ESIDISPENSARY pune 29 1 TEST HDFC 30 1 TEST ICICI Table 2 : Category id CategoryName 1 staff 2 manager Problem is i want to replace IDs with respected values also can i change above query to get expected result Expected Summary Output : ESIDispensary ESILocation test staff manager mumbai mumbai NULL 1 NULL mumbai pune ICICI 1 1 pune pune HDFC NULL 2
Is this is what you want: SELECT (SELECT ComboValue FROM ESI WHERE ID = ESIDispensary) AS ESIDispensary, SELECT ComboValue FROM ESI WHERE ID = ESILocation) AS ESILocation, SELECT ComboValue FROM ESI WHERE ID = test) AS test, Category, [Total Count] FROM ( SELECT ESIDispensary,ESILocation,test,Category, COUNT(*) AS [Total Count] FROM (SELECT category,ESILOCATION,ESIDISPENSARY,TEST FROM(SELECT id,CompanyId,FName,Code,category,ESILOCATION,ESIDISPENSARY FROM dbo.[EmployeeDetail] e WHERE e.CompanyId = 1 AND Category in (1,2)) a LEFT JOIN (SELECT * from (SELECT EmployeeId, CustomeFieldName,FieldValue FROM dbo.[CustomeFieldDetail] C JOIN dbo.[EmployeeDetail] e ON e.id = c.employeeid AND e.CompanyId = c.companyid WHERE e.CompanyId = 1 AND Category IN (1,2)) SRC PIVOT (MAX(FieldValue) FOR CustomeFieldName IN([TEST])) piv) b ON a.Id = b.EmployeeId ) AS a GROUP BY ESIDispensary, ESILocation, test, Category) x
How to find consecutive data in SQL
I have the following data in a SQL Table: I want to find 3 Consecutive data by No and group with ID. Result are How to write query.please help.
Here is query which select only rows where actually 3 consecutive rows are: SELECT a.* FROM TABLE as a inner join TABLE as b on (a.no+1=b.no and a.id=b.id) inner join TABLE as c on (a.no+2=c.no and a.id=c.id) order by a.id, a.no for your data it will provide: 4 a1 4 5 a1 3 1 a2 2 2 a2 4 3 a3 2 4 a3 3 rows (6,a1,1), (3,a2,5) and (5,a3,4) are not selected, as there are no (8,a1) (5,a2) and (7,a3)
DECLARE #temp TABLE (NO int,ID VARCHAR(2),QTY int) INSERT INTO #temp SELECT 1,'A1',5 UNION ALL SELECT 4,'A1',4 UNION ALL SELECT 5,'A1',3 UNION ALL SELECT 6,'A1',1 UNION ALL SELECT 7,'A1',0 UNION ALL SELECT 9,'A1',5 UNION ALL SELECT 12,'A1',3 UNION ALL SELECT 1,'A2',2 UNION ALL SELECT 2,'A2',4 UNION ALL SELECT 3,'A2',5 UNION ALL SELECT 4,'A2',1 UNION ALL SELECT 7,'A2',4 UNION ALL SELECT 9,'A2',5 UNION ALL SELECT 1,'A3',0 UNION ALL SELECT 3,'A3',2 UNION ALL SELECT 4,'A3',3 UNION ALL SELECT 5,'A3',4 UNION ALL SELECT 6,'A3',2; WITH tmpa AS ( SELECT * , NO - ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ID) AS grp FROM #temp ) , tmpb AS ( SELECT * , COUNT(*) OVER(PARTITION BY ID,grp) AS grpcount FROM tmpa ) SELECT NO,ID,QTY FROM tmpb WHERE grpcount>1; Result are 4 A1 4 5 A1 3 6 A1 1 7 A1 0 1 A2 2 2 A2 4 3 A2 5 4 A2 1 3 A3 2 4 A3 3 5 A3 4 6 A3 2 I found this query from this link. Find “n” consecutive free numbers from table http://sqlfiddle.com/#!1/a2633/2 Answer Credit by
Query to return pairs of related rows, but only when both rows exist
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.