[sql] query wil omgekeerde resultaten teruggeven (oid)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Y3PP3R
  • Registratie: Oktober 2002
  • Laatst online: 12-06 21:01
Hallo,

Ik heb een query geschreven om rijen op te halen die niet zijn uitgesloten aan de hand van zoektermen en datums. De query werkte prima, totdat ik het datum-filter er in bouwde. Als ik de query uitvoer krijg ik 0 rijen terug. Als ik aan de select nog D.date, D.excluded toevoeg, en ik haal in de WHERE de D.exluded = 0 weg, blijkt dat alle rijen die hij terug wil geven D.excluded = 1 hebben. Kan dat aan deze query liggen?

SQL:
1
2
3
4
5
6
7
8
9
10
11
    SELECT DISTINCT EA.id, EA.email
    FROM hits AS H
        INNER JOIN hits_addresses AS HA ON H.md5 = HA.md5
        INNER JOIN email_addresses AS EA ON HA.email_address_id = EA.id
        INNER JOIN hits_terms AS HT ON HT.md5 = H.md5
        INNER JOIN searchterms S ON HT.term_id = S.id
        INNER JOIN dates AS D ON CONVERT(varchar,D.[date], 103) = CONVERT(varchar,H.[sent], 103)
    WHERE S.excluded = 0
        AND D.excluded = 0
        AND NOT HA.relation = 5
        AND NOT EXISTS (SELECT * FROM vertices WHERE email_address_id = EA.id)

Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

1. INNER JOIN hits_addresses AS HA ON H.md5 = HA.md5 etc
2. Inner join (date) op basis van een varchar??
3. Is in alle rijen in de date-tabel de colom 'excluded' niet 1 toevallig?
4. Welke DB gebruik je?

[ Voor 33% gewijzigd door Guillome op 26-05-2010 14:27 ]

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • Y3PP3R
  • Registratie: Oktober 2002
  • Laatst online: 12-06 21:01
Hey thanks voor je snelle reply.

1. Of ik er nu AS tussenzet maakt niet uit toch?
2. Die dates weet ik niet goed wat ik er mee moet. dates bevat alleen dagen met een lege tijd, en hits bevat een datum + tijd, en ik wil alleen op datum vergelijken, die tijd boeit me niet.
3. nee, gecheckt ;)
4. Ik gebruik MS SQL 2008 R2.

Update: Door de stored procedure waar hij in zat meerdere keren uit te voeren ging er iets mis door de EXISTS (hij had alles al een keer aangemaakt). Opgelost tot zo ver. Advies over de datum is welkom.

[ Voor 23% gewijzigd door Y3PP3R op 26-05-2010 14:46 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Door bijvoorbeeld de Floor() functie te gebruiken, kun je eenvoudig de tijd van de datum af strippen.
Als je dat voor zowel D.[date] als H.[sent] doet, dan weet je in ieder geval dat de datum op de juiste manier vergeleken wordt.

Bijvoorbeeld:
SQL:
1
INNER JOIN dates AS D ON CAST(FLOOR(CAST(D.[date] AS float)) AS datetime) = CAST(FLOOR(CAST(H.[sent] AS float)) AS datetime)

Acties:
  • 0 Henk 'm!

  • PolarBear
  • Registratie: Februari 2001
  • Niet online
Y3PP3R schreef op woensdag 26 mei 2010 @ 14:32:
Hey thanks voor je snelle reply.

1. Of ik er nu AS tussenzet maakt niet uit toch?
Nee, dat wordt weggeoptimaliseerd in de query compiler.

Acties:
  • 0 Henk 'm!

  • Y3PP3R
  • Registratie: Oktober 2002
  • Laatst online: 12-06 21:01
nieuw probleem, hoop dat ik het hier mag vragen en niet een nieuw topic moet openen...

Mijn query doet niet alle rijen van de dates tabel weergeven, dus ik heb vast mijn joins fout. ik heb al geprobeerd volgordes om te draaien met de right outer join direct na hits of pas als allerlaatste, maar ik krijg steeds niet alle rijen terug.

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT DATEPART(MONTH, dbo.dates.date) AS month, DATEPART(YEAR, dbo.dates.date) AS year, COUNT(*) AS mailcount
FROM  dbo.hits INNER JOIN
               dbo.hits_addresses ON dbo.hits.md5 = dbo.hits_addresses.md5 INNER JOIN
               dbo.email_addresses ON dbo.hits_addresses.email_address_id = dbo.email_addresses.id INNER JOIN
               dbo.custodians_email_addresses ON dbo.custodians_email_addresses.email_address_id = dbo.email_addresses.id INNER JOIN
               dbo.custodians ON dbo.custodians.id = dbo.custodians_email_addresses.custodian_id INNER JOIN
               dbo.hits_terms ON dbo.hits.md5 = dbo.hits_terms.md5 INNER JOIN
               dbo.searchterms ON dbo.hits_terms.term_id = dbo.searchterms.id RIGHT OUTER JOIN
               dbo.dates ON CAST(FLOOR(CAST(dbo.dates.date AS float)) AS datetime) = CAST(FLOOR(CAST(dbo.hits.sent AS float)) AS datetime)
WHERE (dbo.custodians.excluded = 0) AND (dbo.searchterms.excluded = 0) AND (dbo.hits_addresses.relation = 1)
GROUP BY DATEPART(MONTH, dbo.dates.date), DATEPART(YEAR, dbo.dates.date)
ORDER BY year, month


In de dates tabel zitten alle data van 1980 tot 2004 dus ik zou meer rijen terug moeten krijgen dan de huidige 16? ik wil overal waar geen emails zijn gevonden de count op 0 hebben, maar ik weet niet hoe ik dat moet veranderen om dat zo te krijgen.

Acties:
  • 0 Henk 'm!

  • rednek
  • Registratie: Juli 1999
  • Laatst online: 01-09 17:44
damn gast je houd wel van joinen. Ik hoop niet voor je dat dit een veel gebruikte query wordt. :X

Acties:
  • 0 Henk 'm!

  • Coltrui
  • Registratie: Maart 2001
  • Niet online

Coltrui

iddqd

Hebben alle velden waar je op joint wel values? Je zit met inner joins he.

Acties:
  • 0 Henk 'm!

  • Y3PP3R
  • Registratie: Oktober 2002
  • Laatst online: 12-06 21:01
haha ja joinen is favoriet hier, maar 't zijn eenmalige procedures gelukkig. Maar die innerjoins moeten toch null geven als de outer join wel values heeft?

Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Wat is er mis met innerjoins dan?
Ik heb ook wel queries met 8 innerjoins.
Om van een activiteit -> module -> onderdeel -> opleiding + domein + punten bijv.

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • Y3PP3R
  • Registratie: Oktober 2002
  • Laatst online: 12-06 21:01
ik heb 't opgelost door die query hierboven in een with te stoppen en de with nog een keer te outerjoinen op de dates table. Iedereen bedankt weer.
Pagina: 1