Alvaro Herrera escribió:
Linos escribió:
Cuando quiero hacer una consultar a los albaranes de salida donde muestre el
nombre del cliente tengo que hacer o:
SELECT cab.numero_albaran,
CASE
WHEN tipo_cliente = 'CLIENTE' THEN cli.nombre
WHEN tipo_cliente = 'CLIENTE EMPRESA' THEN cli_emp.nombre
WHEN tipo_cliente = 'CLIENTE GRUPO' THEN cli_grp.nombre
ELSE NULL
FROM albaran_salida_cabecera AS cab
LEFT JOIN cliente AS cli ON cli.id_cliente = cab.id_cliente
LEFT JOIN cliente_empresa AS cli_emp ON cli_emp.id_cliente = cab.id_cliente
LEFT JOIN empresa_grupo AS cli_grp ON cli_grp.id_cliente = cab.id_cliente;
Efectivamente parece que necesitara un poco más de normalización.
Creo que deberías tener una única tabla de "clientes", que llevara el
nombre y otros datos comunes; y el resto de los datos podrían ir en una
tabla diferente con columnas para los datos que son únicos a cada tipo.
En un principio la pensé asi pero me di cuenta que el numero de campos comunes
iba a ser ridiculamente bajo. Por ejemplo observa estas dos:
Table "cliente"
Column | Type | Modifiers
------------------+-----------------------+-----------------------------
cliente_id | integer | not null
codigo_cliente | character varying(16) | not null
nombre | character varying(64) |
apellido1 | character varying(64) |
apellido2 | character varying(64) |
sexo | character(1) |
email | text |
puntos | integer | default 0
activado | boolean | default true
revision_datos | boolean | default false
id_direccion | integer |
id_tienda_alta | integer | not null
numero_hijos | integer |
fecha_nacimiento | date |
fecha_alta | date | default ('now'::text)::date
idioma | character varying(64) |
nacionalidad | character varying(64) |
observaciones | text |
numero_tarjeta | character(13) |
id_usuario | integer | not null
correo_devuelto | boolean | default false
Indexes:
"cliente_pkey" PRIMARY KEY, btree (cliente_id)
"uq_codigo_index_cli" UNIQUE, btree (codigo_cliente)
"uq_tarjeta_index_cli" UNIQUE, btree (numero_tarjeta)
"apellido1_index_cli" btree (apellido1)
"apellido2_index_cli" btree (apellido2)
"nombre_index_cli" btree (nombre)
"pattern_apellido1_cli" btree (apellido1 varchar_pattern_ops)
"pattern_codigo_cliente_cli" btree (codigo_cliente varchar_pattern_ops)
"pattern_nombre_cli" btree (nombre varchar_pattern_ops)
"pattern_numero_tarjeta_cli" btree (numero_tarjeta bpchar_pattern_ops)
Table "empresa_cliente"
Column | Type | Modifiers
---------------------+-----------------------+-----------------------------
empresa_id | integer | not null
cif | character varying(16) | not null
email | text |
fecha_alta | date | default ('now'::text)::date
nombre_comercial | text |
nombre | text | not null
id_direccion_fiscal | integer | not null
id_direccion_postal | integer |
forma_pago | character varying(32) | not null
codigo_contable | integer |
dto_especial | integer | default 0
dto_pp | integer | default 0
pais | character varying(64) | not null
divisa | character varying(32) | not null
observaciones | text |
id_regimen_fiscal | integer | not null
id_tarifa | integer | not null
activado | boolean | default true
riesgo_alcanzado | numeric(10,2) | default 0.00
riesgo_permitido | numeric(10,2) | default 0.00
id_persona_contacto | integer |
id_usuario | integer | not null
Indexes:
"empresa_cliente_pkey" PRIMARY KEY, btree (empresa_id)
"uq_codigo_contable_index_empcli" UNIQUE, btree (codigo_contable)
"uq_email_index_empcli" UNIQUE, btree (email)
"uq_nombre_index_empcli" UNIQUE, btree (nombre)
Como puedes ver hay pocas cosas en común, aun así es una opción, quizás mejor
que la que uso actualmente, intentare analizarlo mas a fondo o hacer la prueba a
ver q tal me queda.
Un saludo,
Miguel Angel.
--
TIP 5: ¿Has leído nuestro extenso FAQ?
http://www.postgresql.org/docs/faqs.FAQ.html