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

Responder a