Vita:SQL

message: SQL isn't really a programming language :-) -- Timwi 2004 február 15, 02:53 (CET)
Jó lenne a JOIN részt jobban kifejteni, a példa túl egyszerű és nem látszódik a különböző típusok közti eltérések. - TG.
Hát tegyétek meg zafir vita 2011. december 11., 20:16 (CET)

message: 1. hibás a script: a from előtt nem állhat vessző
 select APP_ID, max(net_income), max(gross_income), max(bonus)
 from (
  select APP_ID,
   case when BUDGET_INFO_TYPE='net_income' then amount else null end   as  net_income,
   case when BUDGET_INFO_TYPE='gross_income' then amount else null end as gross_income,
   case when BUDGET_INFO_TYPE='bonus' then amount else null end as   bonus,
  from acq_budget_info) xx
 group by APP_ID
Tesztelve itt: sqlfiddle.com
letesztelt sql típusok: MySQL 5.6, oracle 11g R2, PostgreSQL 9.6 és 9.3, SQLite (WebSQL), SQLite (SQL.js), MS SQL Server 2017
Javaslat: a belső select-ben a bonus szó után a vesszőt el kell hagyni:
 select APP_ID, max(net_income), max(gross_income), max(bonus)
 from (
  select APP_ID,
   case when BUDGET_INFO_TYPE='net_income' then amount else null end   as  net_income,
   case when BUDGET_INFO_TYPE='gross_income' then amount else null end as gross_income,
   case when BUDGET_INFO_TYPE='bonus' then amount else null end as   bonus
  from acq_budget_info) xx
 group by APP_ID
2. hibás az eredmény kiírása: az oszlopok neve a legtöbb sql-nél a függvényt tartalmazza: "max(net_income)" és nem a megadott NET_INCOME az oszlop neve.
Tesztelés:
Script:
 select APP_ID, max(net_income), max(gross_income), max(bonus)
 from (
  select APP_ID,
   case when BUDGET_INFO_TYPE='net_income' then amount else null end   as  net_income,
   case when BUDGET_INFO_TYPE='gross_income' then amount else null end as gross_income,
   case when BUDGET_INFO_TYPE='bonus' then amount else null end as   bonus
  from acq_budget_info) xx
 group by APP_ID
Eredmény:
-- MySQL 5.6
APP_ID	max(net_income)	max(gross_income)	max(bonus)
0001  	110000         	1000             	7500
0002  	120000         	2000             	8500
0003  	130000         	3000             	9500
-- pl sql
APP_ID	MAX(NET_INCOME)	MAX(GROSS_INCOME)	MAX(BONUS)
0001  	110000         	1000             	7500
0002  	120000         	2000             	8500
0003  	130000         	3000             	9500
-- PostrgreSQL 9.6 - 
app_id	max   	max 	max
0001  	110000	1000	7500
0002  	120000	2000	8500
0003  	130000	3000	9500
-- SQLLite (SQL.js)
APP_ID	max(net_income)	max(gross_income)	max(bonus)
0001  	110000         	1000             	7500
0002  	120000         	2000             	8500
0003  	130000         	3000             	9500
-- SQLLITE (WebSQL)
APP_ID	max(net_income)	max(gross_income)	max(bonus)
0001  	110000         	1000             	7500
0002  	120000         	2000             	8500
0003  	130000         	3000             	9500
-- MS SQL Server 2017
APP_ID	      	    	
0001  	110000	1000	7500
0002  	120000	2000	8500
0003  	130000	3000	9500
(valóban nincsenek oszlopnevek?, ms sql felhasználó tesztelés szükséges)
Javaslat: a script-be kerüljön bele az oszlopok mellé az alias és megjegyzésként, hogy itt az 'as' nem szükséges
Alias-okkal (az oszlopneveknél megadott 'as' elhagyható)
 select APP_ID, max(net_income) as net_inc, max(gross_income) as gross_inc, max(bonus) as bonus_inc
 from (
  select APP_ID,
   case when BUDGET_INFO_TYPE='net_income' then amount else null end   as  net_income,
   case when BUDGET_INFO_TYPE='gross_income' then amount else null end as gross_income,
   case when BUDGET_INFO_TYPE='bonus' then amount else null end as   bonus
  from acq_budget_info) xx
 group by APP_ID
APP_ID	net_inc	gross_inc	bonus_inc
0001  	110000 	1000     	7500
0002  	120000 	2000     	8500
0003  	130000 	3000     	9500
3. Szükséges-e a belső select-et tartalmazó tábla alias elnevezése (kell-e az "xx" felirat?).
Tesztelés:
nem kell: Oracle, SQLlite
kell: MySQL, PostgreSQL, MS SQL Server
Javaslat: megjegyzésként feltüntetni, hogy az xx table alias  nélkül is működik bizonyos esetekben
Diaphol vita 2018. július 26., 11:26 (CEST) diaphol
thread_title:  CASE fejezetnél script javítás, tesztelés, és ugyanitt alias-ok szükségessége 

message: Egyéb utasításokhoz bekerült a JOIN fejezet (alcím2) benne egy példán keresztül cartesian join, inner join, left és right join, full join, self join
Diaphol vita 2018. július 26., 11:31 (CEST) diaphol
thread_title:  JOIN fejezet példával bekerült 

message: Adatdefiníciós utasítások -
FROM-nál szóba kerül a join
"az INNER általában elhagyható, vagy írható helyette LEFT, RIGHT, FULL OUTER, CROSS is." - töröltem mert ez így egyáltalán nem igaz (az INNER join teljesen más mint a LEFT join, nem hagyható el). Lehet hogy az 'outer' kifejezésre gondolt? Vagy arra, hogy a simán leírt join is inner join.
Diaphol vita 2018. július 26., 11:31 (CEST) diaphol
thread_title:  INNER join-nál az inner kifejezés elhagyható? 

message: A Jelentős különbségek az SQL megvalósítások között - Összekapcsolás fejezetet törtöltem mert a kiszolgálók már mindkét megoldást elfogadják.
(Kicsit úgy tűnik mintha nem lett volna világos a descartes-szorzat + where az írónak, homályos volt a megfogalmazás is "SQL kiszolgálok egy része" - melyek?)
Letesztelve itt: http://sqlfiddle.com
A következő verzióknál mindkét inner join működik:
MySQL 5.6, Oracle 11g R2, PostgreSQL 9.6, PostrgreSQL 9.3, SQLite (WebSQL), SQLite (SQL.js), MS SQL Server 2017
Van olyan verzió ahol nem lehet?
Diaphol vita 2018. július 26., 11:31 (CEST) diaphol
thread_title:  A Jelentős különbségek az SQL megvalósítások között - Összekapcsolás - már mindenhol lehet 

message: A Jelentős különbségek az SQL megvalósítások között - 
Az Oracle rendszereiben nincs NUMERIC, helyette a NUMBER-t kell használni
- töröltem mert 12c-ben, 11g R2-ben letesztelve lehet használni a numeric adattípust
create table xxxc (x numeric);
insert into xxxc values (5);
(valószínűleg korábbi verziókban nem, itt meg kellene nézni hogy mióta van erre lehetőség? mindenesetre a mondat tartalmilag helytelen volt)
Ugyanitt számomra homályos az "oracle nem támogatja" megfoglamazás - mit jelent ez pontosan? create table lehetséges
(de ezeken a mondatokon nem változtattam)
Diaphol vita 2018. július 26., 11:32 (CEST) diaphol
thread_title:  A Jelentős különbségek az SQL megvalósítások között -  Az Oracle rendszereiben nincs NUMERIC, helyette a NUMBER-t kell  - töröltem