WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   SQL statement (http://www.wcm.at/forum/showthread.php?t=147364)

reichr 13.10.2004 09:40

SQL statement
 
hy!

möchte von t1 alle zeilen zurückbekommen wo in der spalte sBsArNr ein datensatz öfter als einmal vorkommt.

wie stell ich das am besten an?

mqs 13.10.2004 09:57

ich würds wahrscheinlich so machen, dass ich die stichwörter in ein feld lade, und dann die anzahl der jeweiligen auslese... und dann mit ner for schleife das ganze ausgeben.. ist evt n bisschen kompliziert gedacht..


so in der art?

PHP-Code:



$ergebnis 
mysql_query("SELECT sBsArNr FROM t1 ORDER BY sBsArNr");
while(
$row mysql_fetch_object($ergebnis))

$neweintrag=$row->sBsArNr;
 if(
$oldeintrag!=$neweintragfeld[]=$row->sBsArNr;
$oldeintrag=$neweintrag;
}

for(
$i=0;$i<count($feld);$i++)
{
$anz= @mysql_num_rows(@mysql_query("SELECT sBsArNr FROM t1 WHERE sBsArNr='$feld[]'"));
echo 
$anz;



käptn 13.10.2004 10:13

Bei MySQL könntest du das mit HAVING realiasieren, aber wenn ich mich richtig erinnere bits du MSSQL Jünger?

~

reichr 13.10.2004 10:21

@käptn

ja, wäre auf MSSQL server

mqs 13.10.2004 11:15

ok.. habt ihr einen link für optimierte mysql abfragen, weil wenn du sagst dass das einfacher geht würd mich das auch gerne interessieren.. weil mir kommt es so vor, dass ich da von vielen befehlen keine ahnung hab, die mir einiges erleichtern würden

käptn 13.10.2004 12:27

HAVING ist weit davon entfernt, um als "optimiert" bezeichnet werden zu können.

Sehe gerade, dass auch MSSQL HAVING unterstützt.

Also, etwa so:
Code:

SELECT *, COUNT(*) AS anzahl
FROM table
HAVING anzahl > 1;

~

JackLemon 13.10.2004 13:26

wozu dann eigentlich having? ist where nicht mehr 'in'? oder macht das wirklich einen unterschied?

SELECT *, COUNT(*) AS anzahl
FROM table
WHERE anzahl > 1;

käptn 13.10.2004 13:31

Der Alias "anzahl" ist zur Zeit der Evaluierung der WHERE Klausel noch nicht verfügbar.

Ah ja, ausserdem fehlt in meinem Statement eine GROUP BY Klausel.

~

JackLemon 13.10.2004 13:43

ah, hast natürlich recht. wie praktisch!

JackLemon 13.10.2004 13:57

moment: selbst mit "GROUP BY" wird dein statement nicht das machen was "reichr" wollte: mit "...wo in der spalte sBsArNr ein datensatz öfter als einmal vorkommt" hat er wohl gemeint "wo mehr als ein datensatz die selbe artikelnummer hat". kann mit deinem statement nicht gehen, weil du ja nicht alle zutreffenden rows ausspuckst sondern sie ja aggregieren möchtest (wonach denn eigentlich? alle felder außer der artikelnummer sind ja potenziell verschieden!)

ich sag nur: theta-join!

SELECT DISTINCT tab1.* FROM t1 tab1, t1 tab2 WHERE tab1.sBsArNr = tab2.sBsArNr;

pc.net 13.10.2004 14:14

und wie wärs mit einem sub-select?
Code:

select distinct tab1.sBsArNr
from t1 tab1
where 1 < (select count(1)
          from t1 tab2
          where tab2.sBsArNr = tab1.sBsArNr)
;

und wenn man die anzahl der vorkommen auch noch wissen will, dann so:
Code:

select tab1.sBsArNr,
            count(tab1.sBsArNr)
from t1 tab1
where 1 < (select count(1)
          from t1 tab2
          where tab2.sBsArNr = tab1.sBsArNr)
group by tab1.sBsArNr
;


JackLemon 13.10.2004 14:31

keine chance, mein statement ist abzüglich whitespaces um 1/3 kürzer. wir müssen doch auch an den speicherplatz denken!!

käptn 13.10.2004 15:40

Wo liegt das Problem? ;)

Code:

SELECT
  *, COUNT(*) AS anzahl
FROM
  t1
GROUP BY
  sBsArNr
HAVING
  anzahl > 1

~

JackLemon 13.10.2004 16:26

'tschuldigung, vielleicht steh' ich jetzt auf der leitung, aber mit

SELECT *, COUNT(*) AS anzahl

bekommst du doch alle tabellenfelder + das anzahl-feld. gut. das anzahl-feld wird durch GROUP BY() in die aggregatfunktion eingeschlossen. aber alle anderen felder sind imho _kein_ teil der aggregatfunktion. wie soll denn das bitte funktionieren??

und wenn's dich interessiert, mein sql-server kann das nicht mal kompilieren: "ungültiger spaltenname 'anzahl'"... (hab das ganze klarerweise auf eine passende datenstruktur bei mir umgeändert)

:heul:

pc.net 13.10.2004 17:59

Zitat:

Original geschrieben von JackLemon
keine chance, mein statement ist abzüglich whitespaces um 1/3 kürzer. wir müssen doch auch an den speicherplatz denken!!
tjo ... mit einer ordentlich oracle-db macht das auch bei mehreren millionen datensätzen kein problem :D

käptn 13.10.2004 18:59

Man (Jack) gehe auf das 1. Post und lese es genau durch.
Weiters passe man den SQL Dialekt an sein RDBMS an oder nehme pc.net's Sub-Select Lösung. ;)

Code:

SELECT
  *
FROM
  t1
GROUP BY
  sBsArNr
HAVING
  COUNT(*) > 1

Dat iss jet aber unjetestet! :)

~

JackLemon 13.10.2004 21:44

isses nicht, käptn.

und wenn du mir nicht glaubst versuch's doch einfach. mysql frisst es, gibt aber nur eine einzige row pro n matches raus. was ja kaum das ziel sein wird - wenn er doppelte artikelnummern "bekämpfen" möchte dann wird er wohl alle rows brauchen die dieselbe artnr enthalten und nicht nur eine. das macht im übrigen auch der php-code im ersten post...

der mssql (um den es hier geht!) kompiliert es wieder nicht, weil er - wie ich schon angemerkt habe - der meinung ist dass die restlichen felder des selects ("*") in keiner aggregatfunktion inkludiert sind. und würdest du ihm alle felder explizit hinschreiben müsstest du sie trotzdem irgendwie aggregieren, mit SUM() oder COUNT() oder FIRST() oder sonstwas und das passt dann erst wieder nicht (->mysql-ergebnis).

kann es sein dass dein code nur mit oracle, version 7.1i-beta13 built-56 funktioniert? :D

wie dem auch sei, ein toter thread. reichr, halt dich an pc.net's subselect ;)

käptn 14.10.2004 10:36

Mea cupla :rolleyes: Was verwirrst mich auch so? :D

~


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag