Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MS-SQL] Query in een query

Pagina: 1
Acties:

  • MrCaBLeGuY
  • Registratie: Februari 2002
  • Niet online

MrCaBLeGuY

powered by yellow bird

Topicstarter
Ik ben -helaas- geen SQL expert maar weet er me weg in te vinden. Ik zit nu echter met een probleem. Ik het een bestaande query (die gebruik maakt van fulltext search).

code:
1
2
3
4
5
6
7
8
9
10
11
ALTER PROCEDURE [dbo].[spiderSearch]
    @q varchar(45)
AS
BEGIN

SELECT TOP 100 *  FROM spiderbase
 INNER JOIN CONTAINSTABLE ( spiderbase , (entry_ARTID,entry_BRAND,entry_ARTNAME) , @q  )  AS KEY_TABLE 
ON spiderbase.entry_id = KEY_TABLE.[KEY]
ORDER BY RANK desc, entry_PRICE ASC

END


Hieruit komt een zoekresultaat (uit enkele 10 duizenden rows). Nu wil ik specifiek in deze uitkomst een nieuwe query kunnen uitvoeren. Echter hoe ik ook zoek op "query in query" of soortgelijke strekkingen, ik kom nergens voorbeelden tegen. Als ik een voorbeeld heb kom ik er wel weer uit. Begrijp dat dit forum niet voor noobs is maar hoop dat iemand een voorbeeldje dan wel een korte uitleg heeft. Merci

  • bredend
  • Registratie: September 2001
  • Laatst online: 19-11 22:54

  • MrCaBLeGuY
  • Registratie: Februari 2002
  • Niet online

MrCaBLeGuY

powered by yellow bird

Topicstarter
Heb wel gedacht aan subqueries maar dat -lijkt mij- tot 1 keer dieper zoeken handig. De uiteindelijke bedoeling is dat er door een aantal 3/4 max 5 zoekopdrachten (steeds in de laatste getoonde Query uitslag) een goed eindresultaat komt. Dus dan zou bij 4 opdrachten de query uit 4 subquerys moeten bestaan en dat lijkt me bij om en nabij 4/5 miljoen rows nogal zwaar.

  • BCC
  • Registratie: Juli 2000
  • Laatst online: 17:11

BCC

Eeh, volgens mij wil je gewoon je extra eisen toevoegen dmv AND ipv een subquery? Lijkt me lichterlijk efficienter en moet dezelfde resultaten opleveren.

[ Voor 40% gewijzigd door BCC op 18-03-2008 23:54 ]

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


  • MrCaBLeGuY
  • Registratie: Februari 2002
  • Niet online

MrCaBLeGuY

powered by yellow bird

Topicstarter
BCC schreef op dinsdag 18 maart 2008 @ 23:53:
Eeh, volgens mij wil je gewoon je extra eisen toevoegen dmv AND ipv een subquery? Lijkt me lichterlijk efficienter.
Nee niet precies. Mensen zoeken op producten, doen daarbij zelf een gok bijvoorbeeld Canon AND EOS AND 400D. Dan krijgen ze een resultaat die weer gefiltert moet worden op bijvoorbeeld, BODY, of 18-55 (of what so ever) en eventueel na die zoekopdracht nog een keer gefinetuned moet worden om het gewenste resultaat te krijgen.

  • purge
  • Registratie: November 2000
  • Niet online
* purge is het met BCC eens.
Wat zou er niet gaan werken met extra AND criteria? Probeer het eens ;-)
(simpel) voorbeeld: WHERE (eerste filter) AND (tweede filter)

[ Voor 13% gewijzigd door purge op 19-03-2008 00:12 ]


  • MrCaBLeGuY
  • Registratie: Februari 2002
  • Niet online

MrCaBLeGuY

powered by yellow bird

Topicstarter
Als mensen in 1 keer goed zoeken zou dat werken. Maar ik ga er vanuit dat iemand ergens op zoekt en teveel resultaten krijgt (meer dan gewenst om een keuze te kunnen maken). Dus moet het getoonde resultaat met slechts 1 zoekopdracht verfijnt kunnen worden (telkens opnieuw indien gewenst). Als ik eindeloos subqueries ga gebruiken, voorbeeldje:

code:
1
2
3
4
5
    SELECT entry_ARTNAME FROM spiderbase WHERE entry_ARTNAME 
    IN (SELECT entry_ARTNAME FROM spiderbase WHERE entry_ARTNAME 
    IN (SELECT entry_ARTNAME FROM spiderbase WHERE entry_ARTNAME
    IN (SELECT entry_ARTNAME FROM spiderbase WHERE entry_ARTNAME LIKE '%400d%') 
    AND entry_ARTNAME LIKE '%18%') AND entry_ARTNAME LIKE '%200%') AND entry_ARTNAME LIKE '%BG%'


wordt het zo traag als ****.

EDIT: Even toevoegend, het gaat om een zoekopdracht in 5 colums, door middel van een ranking blijft er steeds een TOP x aantal over. Ik wil dus bij verfijnde zoekopdrachten niet alles erbij betrekken wat buiten de ranking is gevallen.

PS. Die bovenslaande query slaat helemaal nergens op trouwens nu ik er nog eens naar kijk, dat is hetzelfde als:

code:
1
SELECT entry_ARTNAME FROM spiderbase WHERE entry_ARTNAME LIKE '%18%' AND entry_ARTNAME LIKE '%200%' AND entry_ARTNAME LIKE '%BG%'


|:(

[ Voor 24% gewijzigd door MrCaBLeGuY op 19-03-2008 00:19 ]


  • BCC
  • Registratie: Juli 2000
  • Laatst online: 17:11

BCC

Tijd om te gaan slapen MrCaBLeGuY :)

[ Voor 18% gewijzigd door BCC op 19-03-2008 00:30 ]

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


Verwijderd

Ben het ook wel eens met BCC en purge. Gebruikers zijn volgens mij zelf ook goed in staat om hun zoekresultaat te verfijnen door een andere zoekopdracht te geven.

Maar als je echt zoiets wilt; kun je geen temporary table aanmaken met de resultaten, en hier vervolgens een nieuwe query op los laten?

  • MrCaBLeGuY
  • Registratie: Februari 2002
  • Niet online

MrCaBLeGuY

powered by yellow bird

Topicstarter
Ik ga toch maar voor de AND. Bij een nieuwe zoekopdracht in een resultaat de oude als AND meenemen, gezien google dat ook zo doet :) Er staan nu 400.000 rows in en query time is retesnel, dus dat gaat loslopen hoop ik.

Idd tijd om te slapen :) Als heb ik wel weer me volgende probleem maar daarvoor maar een nieuw topic, staat hier helemaal los van :(

Deze mag wat mij betreft op slot, bedankt voor de nachtelijke support.

PS. Zie tijd om te gaan slapen post, en tijd van me afsluit post ;) Niet gelukt.

[ Voor 8% gewijzigd door MrCaBLeGuY op 19-03-2008 06:56 ]


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Je kunt eventueel 'WITH AS' gebruiken
SQL:
1
2
3
4
5
WITH SearchResults as
(
   select * from spiderBase where keyword like '%whatever%'
)
select top 10 * from SearchResults order by Rank desc

Deze methode gebruik ik vaak als ik een group by query resultaat wil gebruiken om daarover te filteren. Vroeger maakte ik gebruik van tijdelijke tabellen (#SearchResult), maar WITH AS doe eigenlijk hetzelfde alleen hoef je dan niet de tabel te creëren en te verwijderen.

If it isn't broken, fix it until it is..


Verwijderd

Ik zou alleen geen trage like gebruiken als je gebruikt maakt van Full-Text maar gewoon CONTAINSTABLE

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Ik zit net te denken. Waarom houd je niet in een sessie een List<string> collectie bij waarin je de verschillende filters bijhoud. Als de gebruiker zijn zoekopdracht verfijnd, dan komt er alleen een extra item in de collectie welke je volgens omdat tot een AND where clause.

Met Linq zou je programmatisch kunnen filteren op een eerder opgehaalde resultaat. Ook bij deze oplossing geld dat je dan het resultaat dient te 'bewaren' in bijvoorbeeld een sessie omdat je de resultaat collectie telkens gebruikt om verder te filteren.

Twee opties die zomaar bij mij te binnen schieten.

If it isn't broken, fix it until it is..


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Verwijderd schreef op woensdag 19 maart 2008 @ 15:09:
Ik zou alleen geen trage like gebruiken als je gebruikt maakt van Full-Text maar gewoon CONTAINSTABLE
Ik heb hier juist een like gebruikt ipv containstable zodat de TS de query nog moet verbouwen. Wij proberen hier mensen te helpen. Dat helpen gaat het best als je iemand een techniek/opties voorlegt. De focus betreft het gebruik van de WITH AS constructie, niet de query daarin.

Daarbij gaan de meeste full-text search over meerdere velden waar een like beperkt is tot een enkele column.

Het is dus aan de TS om de hand vaten die wij hier bieden te implementeren in zijn code..

If it isn't broken, fix it until it is..


Verwijderd

Niemand_Anders schreef op donderdag 20 maart 2008 @ 09:13:
[...]
Daarbij gaan de meeste full-text search over meerdere velden waar een like beperkt is tot een enkele column.
Zoeken over alle velden met FullText
SQL:
1
2
3
4
SELECT Id, Titel, Beschrijving,KEY_TBL.RANK, KEY_TBL.[KEY]
FROM myTABLE
INNER JOIN CONTAINSTABLE(myTABLE, *, @SearchText, 50) KEY_TBL 
ON myTABLE.ID = KEY_TBL.[KEY]


Zoek in alleen beschrijving
SQL:
1
2
3
4
SELECT Id, Titel, Beschrijving,KEY_TBL.RANK, KEY_TBL.[KEY]
FROM myTABLE
INNER JOIN CONTAINSTABLE(myTABLE, Beschrijving, @SearchText, 50) KEY_TBL 
ON myTABLE.ID = KEY_TBL.[KEY]

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Verwijderd schreef op donderdag 20 maart 2008 @ 13:21:
[...]

Zoeken over alle velden met FullText
SQL:
1
...


Zoek in alleen beschrijving
SQL:
1
...
En wat is nou je punt? Je bevestigd nu mijn punt dat dat je met een full-text search over 1 of meerdere velden kunt zoeken, waarbij de like beperkt is tot 1 veld. Nogmaals de focus betreft de WITH AS constructie en niet de query, want die is totaal niet belangrijk.

If it isn't broken, fix it until it is..

Pagina: 1