webForumDet fria alternativet
Logga in / Bli medlem

JOIN

Databaser & SQL

4 svar · 482 visningar · startad av devotion

Medlem sedan jan. 20013 582 inlägg
Frågan#1

Hej!

Har ett antal tabeller:

tblCustomer
tblCustomerRef
tblObject
tblExtraFieldData

Jag har gjort följande SQL:

SELECT tblCustomer.[Nr] AS CustomerNr, tblCustomer.[Name] AS CustomerName, tblCustomerRef.[Name] AS CustomerOrderer, tblCustomerRef.[Name] AS CustomerContact, tblCustomer.PricelistNr AS CustomerPriceList
FROM tblCustomer 
LEFT JOIN tblCustomerRef
ON tblCustomerRef.CustomerId = tblCustomer.[Id]
INNER JOIN tblObject
ON tblObject.CustomerId = tblCustomer.[Id]
INNER JOIN tblExtraFieldData
On tblObject.[Id] = tblExtraFieldData.OwnerId

Den returnerar 3 poster enligt bifogad bild

Det beror på att det finns 2 kontaktpersoner i tblCustomerRef. ([Name])

Jag vill att endast två poster ska returneras och att den kontaktperson som är mostImportant = 1 ska visas

Dvs i tblCustomerRef finns det ett fält som heter mostImportant (se bild)

Mvh
Henrik

ScreenShot001.jpgScreenShot002.jpg
Medlem sedan juni 200032 967 inlägg
#2

finns det alltid någon som är mostImportant?

...
LEFT JOIN tblCustomerRef
ON tblCustomerRef.CustomerId = tblCustomer.[Id] and tblCustomerRef.MostImportant = 1
...

edit: det finns det tydligen inte - så då var lösningen inte lika enkel.

Medlem sedan jan. 20013 582 inlägg
#3

hmmm...

Huvudet på spiken.... Som vanligt.. :)

Jag gjorde om frågan till denna:

SELECT tblCustomer.[Nr] AS CustomerNr, tblCustomer.[Name] AS CustomerName, tblCustomer.PricelistNr AS CustomerPriceList, 
(SELECT [Name] FROM [tblCustomerRef] WHERE [tblCustomerRef].[CustomerId]=[tblCustomer].[Id] AND [MostImportant]=1) AS CustomerContact,
(SELECT [Name] FROM [tblCustomerRef] WHERE [tblCustomerRef].[CustomerId]=[tblCustomer].[Id] AND [MostImportant]=1) AS CustomerOrderer
FROM tblCustomer 
INNER JOIN tblObject
ON tblObject.CustomerId = tblCustomer.[Id]
INNER JOIN tblExtraFieldData
On tblObject.[Id] = tblExtraFieldData.OwnerId

Dvs tog bort en join och gjorde en subselect...

Det funkar ju finfint. Får bara ut 2 poster och den person som är satt till mostImportant

Då kommer vi ju till det problemet som du just berörde... Vad händer om det inte finns någon mostImportant? (Det kan det göra)

Hur löser man det? Då kan man bara ta första bästa....

Mvh
Henrik

Medlem sedan dec. 20025 483 inlägg
#4
SELECT
	[Name]
FROM
	[tblCustomerRef] q
WHERE
	[CustomerId]=[tblCustomer].[Id] AND
	([MostImportant]=1 OR (([MostImportant] IS NULL OR [MostImportant]=0) AND
		[Id] = (SELECT MAX([Id]) FROM [tblCustomerRef] WHERE [CustomerId]=q.[CustomerId])) AND
		NOT EXISTS (SELECT TOP 1 1 FROM [tblCustomerRef] WHERE [CustomerId]=q.[CustomerId] AND [MostImportant]=1))
Medlem sedan jan. 20013 582 inlägg
#5

Hepp!

Så då:

SELECT tblCustomer.[Nr] AS CustomerNr, tblCustomer.[Name] AS CustomerName, tblCustomer.PricelistNr AS CustomerPriceList, 
(SELECT [Name] FROM [tblCustomerRef] q WHERE [CustomerId]=[tblCustomer].[Id] AND ([MostImportant]=1 OR (([MostImportant] IS NULL OR [MostImportant]=0) AND [Id] = (SELECT MAX([Id]) FROM [tblCustomerRef] WHERE [CustomerId]=q.[CustomerId])) AND NOT EXISTS (SELECT TOP 1 1 FROM [tblCustomerRef] WHERE [CustomerId]=q.[CustomerId] AND [MostImportant]=1))) AS CustomerContact,
(SELECT [Name] FROM [tblCustomerRef] q WHERE [CustomerId]=[tblCustomer].[Id] AND ([MostImportant]=1 OR (([MostImportant] IS NULL OR [MostImportant]=0) AND [Id] = (SELECT MAX([Id]) FROM [tblCustomerRef] WHERE [CustomerId]=q.[CustomerId])) AND NOT EXISTS (SELECT TOP 1 1 FROM [tblCustomerRef] WHERE [CustomerId]=q.[CustomerId] AND [MostImportant]=1))) AS CustomerOrderer
FROM tblCustomer 
INNER JOIN tblObject
ON tblObject.CustomerId = tblCustomer.[Id]
INNER JOIN tblExtraFieldData
On tblObject.[Id] = tblExtraFieldData.OwnerId

Tackar!

Mvh
Henrik

257 ms totalt · 4 externa anrop · v20260731065814-full.05830320
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)