webForumDet fria alternativet

Select Exists

15 svar · 195 visningar · startad av erka

erkaMedlem sedan dec. 19994 597 inlägg
#1

Hmmm brukar inte det här fungera eller är jag helt trött och störd idag.

strSQL = "SELECT * FROM DistributorProduct WHERE DistId EXISTS IN "_
	&"(SELECT * FROM Distributors WHERE Countryname_ID = "& IntCountryId &") "

Vad jag försöker göra är alltså att plocka ut de från DistributorProduct vars DistId finns i distributors där deras CountryName_Id är någonting, tex SE

hjälp :)

------------------
Real mad hiphop flavaz kickin' it right from tha street without no FEAR, Yo !

LarsGMedlem sedan dec. 200012 465 inlägg
#2
strSQL = "SELECT * FROM DistributorProduct WHERE DistId IN "_
&"(SELECT distid FROM Distributors WHERE Countryname_ID = "& IntCountryId &") "

Lite kontamination där.

------------------
essentitia preter non sans multiplicandum

erkaMedlem sedan dec. 19994 597 inlägg
#3

tack larsg, min skalle är not kontaminerad av något underligt virus

------------------
Real mad hiphop flavaz kickin' it right from tha street without no FEAR, Yo !

erkaMedlem sedan dec. 19994 597 inlägg
#4

Det fungerar ändå inte som jag tänkt mig *suck* Jag har i distributorsproduct 4 olika produktgrupper som är en bit, det finns också DistID så man kan se om en Disitrbutör har den produkten eller inte, vad jag vill åstakomma blir lättare att förstå med följande scenario.

Jag väljer land England och får CountryName_ID = 23. Nu ska jag kolla om det i hela england finns distributörer till alla produktgrupper.

strSQL = "SELECT DISTINCT * FROM DistributorProduct WHERE DistId IN "_
	&"(SELECT distid FROM Distributors WHERE Countryname_ID = "& IntCountryId &") "

Så om det i england säljs alla produktgrupper utom nr4 ska det bli detta resultat vid utskrift
True,True,True,False. Men om alla distributörer tillsammans täcker alla 4 grupper blir det True,True,True,True osv.

Någon som förstår vad jag menar ?

------------------
Real mad hiphop flavaz kickin' it right from tha street without no FEAR, Yo !

LarsGMedlem sedan dec. 200012 465 inlägg
#5

Jo, det var ju något helt annat.

Jag förstår vilket resultat du vill ha, men jag får inte ihop alla bitar.

distributorsproduct 4 olika produktgrupper

Är det fyra olika poster eller fyra olika kolumner?

Hur syns det i Distributors att den säljer en viss produktgrupper?

------------------
essentitia preter non sans multiplicandum

erkaMedlem sedan dec. 19994 597 inlägg
#6

Ok. Jag har en tabell som heter

DistributorProduct
-DistId (vilken dist det är, relation till DistId i Distributors)
-CD (bit, 1 om han har denna)
-VINYL (bit, 1 om han har denna)
-CLOTHES (bit, 1 om han har denna)
-ACCES (bit, 1 om han har denna)

Sen en tabell som heter

Distributors
DistId - Räknare
CountryName_ID (Vilket land han finns i)
massa andra fält med uppgifter om distributören

jag gör en distributörsvisningssida, där man först listar alla i valt land men har möjligheten genom en dropdownmeny att selectera valt land och produktgrupp. Först tex jag väljer england, alla distr. i england listas, sen om jag väljer Clothes i menyn skickas man till en sida som plockar ut och visar de distr. i england som har Clothes. Det jag behöver det vi håller på med (du och jag) är för att om ett land inte har någon distr. som säljer kläder ska inte heller kläder komma upp i droppdownmenyn. Förstår du mer nu?

tack!

------------------
Real mad hiphop flavaz kickin' it right from tha street without no FEAR, Yo !

[Redigerat av erka den 07 feb 2002]

LarsGMedlem sedan dec. 200012 465 inlägg
#7

Med den datamodellen så blir det något komplicerat.

select case when exists (select 1 from distributorProduct dp inner join distributor d
                             on dp.distid = d.distid 
                          where d.CD = 1) then 'true' else 'false' end as CD,
       case when exists (select 1 from distributorProduct dp inner join distributor d
                             on dp.distid = d.distid 
                          where d.VINYL = 1) then 'true' else 'false' end as VINYL,
       case when exists (select 1 from distributorProduct dp inner join distributor d
                             on dp.distid = d.distid 
                          where d.CLOTHES = 1) then 'true' else 'false' end as CLOTHES
       case when exists (select 1 from distributorProduct dp inner join distributor d
                             on dp.distid = d.distid 
                          where d.ACCESS = 1) then 'true' else 'false' end as ACCESS

------------------
essentitia preter non sans multiplicandum

erkaMedlem sedan dec. 19994 597 inlägg
#8

------------------
Real mad hiphop flavaz kickin' it right from tha street without no FEAR, Yo !

[Redigerat av erka den 07 feb 2002]

erkaMedlem sedan dec. 19994 597 inlägg
#9

Är det en korkad datamodell förutom att det inte är smart att ha DistributorProducts så eftersom den växer på bredden om man slänger in mer produktgrupper, skulle kunnat ha en länktabell där jag satt in produktgrupp och distid, samt en tabell som hanterar produktgrupperna. Men nu är det inte jag som byggt databasen och en del andra applikationer använder den :(

Stort tack larsg!

------------------
Real mad hiphop flavaz kickin' it right from tha street without no FEAR, Yo !

LarsGMedlem sedan dec. 200012 465 inlägg
#10

Jo, det är ju alltid bättre att lägga saker som separata poster än att lägga till flera kolumner, så jag tycker att du borde bryta ut produktgrupperna till en separat tabell.

Om du lägger dessa som enskilda rader så behöver du inte ändra på någon fråga om du lägger till någon produktgrupp.

------------------
essentitia preter non sans multiplicandum

erkaMedlem sedan dec. 19994 597 inlägg
#11

Ska gå igenom vad den används till exakt databasen, kommer nog bygga om den. Hittade ett fel LarsG, alla "where d.CD = 1" osv ska vara dp.CD osv. ;) Tack igen!

------------------
Real mad hiphop flavaz kickin' it right from tha street without no FEAR, Yo !

erkaMedlem sedan dec. 19994 597 inlägg
#12

Hmmm nu får jag ju true överallt eftersom jag inte lyckas få in lands aspekten så att säga, måste ju skriva where CountryName_ID = "& IntCountryId &" någonstanns, men var, lyckas inte få det att fungera..hmm

------------------
Real mad hiphop flavaz kickin' it right from tha street without no FEAR, Yo !

LarsGMedlem sedan dec. 200012 465 inlägg
#13

Du får stoppa in det i varje delfråga

str = "select case when exists (select 1 from distributorProduct dp inner join distributor d on dp.distid = d.distid 
where dp.CD = 1  and Countryname_ID = " & IntCountryId &
") then 'true' else 'false' end as CD "

och så vidare.

------------------
essentitia preter non sans multiplicandum

erkaMedlem sedan dec. 19994 597 inlägg
#14

he he jag hade skrivit d.Countryname_ID vid varje men det fungerade ju inte ;) Tack igen, ska inte störa mer.

------------------
Real mad hiphop flavaz kickin' it right from tha street without no FEAR, Yo !

erkaMedlem sedan dec. 19994 597 inlägg
#15

Hej igen LarsG :) Jag gör lite tester med en länktabell och har nu följande tabeller

PGroups
-ProductGroupId (PK,Int med identity)
-ProductGroupName (Char)

PGroupLink
-DistId (FK, int, relaterad till Distributors.DistId)
-ProductGroupId (int, relaterad till PGroups.ProductGroupId )

Skrev ett litet snabb script för att få ut samma resultat som vi har fått med tidigare hjälp

strSQL2 = "SELECT DISTINCT * FROM PGroupLink WHERE DistId IN "_
	&"(SELECT distid FROM Distributors WHERE Countryname_ID = "& IntCountryId &") "_
	&"ORDER BY ProductGroupId ASC"
	
	ArrRS2 = Cn.Execute(strSQL2).getrows()
	strGroup = ""
			For y = 0 to ubound(ArrRS2,2)
				If ArrRs2(1,y) <> strGroup Then
					Response.Write "<br>"& ArrRs2(1,y) &"<br>"
						Select Case  ArrRs2(1,y)
							Case "1"
							Response.Write"Grupp1"
							Case "2"
							Response.Write"Grupp2"
							Case "3"
							Response.Write"Grupp3"
							Case "4"
							Response.Write"Grupp4"
						End Select
	
				End If
				strGroup = ArrRs2(1,y)
			Next
	Erase ArrRs2

Ser du någon smidigare sqlfråga i ditt djuptstorakunskapsföråd om sql :) Har du inte tid så spelar det inte så stor roll, det fungerar men är nog inte optimalt, snabbare än tidigare kod iaf.

------------------
Real mad hiphop flavaz kickin' it right from tha street without no FEAR, Yo !

LarsGMedlem sedan dec. 200012 465 inlägg
#16
select case when count(pgl.distid) > 0 then 'true' else 'false' end as distributorExists,
       pg.ProductGroupName
  from Pgroups as pg left outer join Pgrouplink as pgl on pg.productGroupid = pgl.productGroupid
       left outer join Distributors as d on pgl.distid = d.distid and d.Countryname_ID = 4711 -- eller nåt

group by pg.ProductGroupName
ORDER BY pg.ProductGroupName

Då får du gruppnamnet också, så då behöver du inte asp-koden.

------------------
essentitia preter non sans multiplicandum

Genererad på 379 ms · cache AV · v20260730165559-full.f96bc7eb