2011-11-29 4 views
0

Мне нужна помощь в разработке таблицы SQL. Предположим, у меня есть cardnumber, картаty, field1, field2, и field3.Какую схему базы данных следует использовать?

Cardtype - это перечисление, которое может быть «спереди», «назад» или «обоими».

  1. Я хочу ВЫБРАТЬ front.field1, front.field2, front.field3, back.field1, back.field2, back.field3 ИЗ некоторой таблицы или представления WHERE cardnumber = XXX.

  2. Большинство записей будет содержать поле1, поле2, поле3 и «оба», указывающие на то, что я должен получить front.field1 таким же, как back.field1 и т. Д., Когда я ВЫБРАТЬ. Когда «фронт» и «назад» различны, мне понадобятся два ряда с одним и тем же номером карты, но один с «фронтом», а другой с «спиной» вместе с соответствующим полем 1 ... поле3 для каждой стороны.

Как создать эту таблицу. Должен ли я использовать какой-то взгляд из INNER JOIN или LEFT/RIGHT JOIN?

Я открыт для разных проектов, но я надеюсь, что любой дизайн будет прост в обслуживании (с учетом того, что большинство записей будет содержать одну строку, содержащую «оба») и может удовлетворить моему требованию SELECT.

ответ

1
Card 
-------------------------------------------- 
CardNumber  CardType_id field1  etc 

CardType 
-------------------------------------------- 
ID  Description 


SELECT 
    Card.*, 
    CardType.Description 
FROM Card 
      INNER JOIN CardType 
       ON Card.CardType_id = CardType.ID 
WHERE CardType.Description = 'your description value' 
+0

OK - это почти дал мне то, что я искал - я закончил все 4 перестановки: FRONT/FRONT, FRONT/BACK, BACK/FRONT и BACK/BACK, но это можно легко исправить, добавив фильтры в инструкцию WHERE, чтобы вернуть только 1 из 4. tyvm. – kfmfe04

1

Возможно, у вас уже есть проект и вы ищете запрос. Я добавил инструкции create table/insert, чтобы показать мою интерпретацию вопроса. Это предполагает ряд элементов целостности, таких как:

  • , если у вас есть «ФРОНТ» запись на карту, вы также будете иметь один (и только один ) «Назад» запись на карту. я

  • , если у вас есть «ОБА» запись на карту, то не буду никаких других записей

Ран это с помощью Postgresql:

CREATE TABLE card(cardnumber int, cardtype varchar(5), field1 varchar(16), field2 varchar(16), field3 varchar(16)); 

INSERT INTO card VALUES(1, 'FRONT', 'a', 'b', 'c'); 
INSERT INTO card VALUES(1, 'BACK', 'd', 'e', 'f'); 
INSERT INTO card VALUES(2, 'BOTH', 'x', 'y', 'z'); 


SELECT c1.cardnumber 
     ,c1.field1 AS frontField1, c1.field2 AS frontField2, c1.field3 AS frontField3 
     ,c2.field1 AS backField1, c2.field2 AS backField2, c2.field3 AS backField3 
    FROM card c1 
     ,card c2 
    WHERE c1.cardtype = 'FRONT' 
    AND c2.cardtype = 'BACK' 
    AND c1.cardnumber = c2.cardnumber 
UNION 
SELECT c.cardnumber 
     ,c.field1 AS frontField1, c.field2 AS frontField2, c.field3 AS frontField3 
     ,c.field1 AS backField1, c.field2 AS backField2, c.field3 AS backField3 
    FROM card c 
    WHERE c.cardtype = 'BOTH'; 

cardnumber | frontfield1 | frontfield2 | frontfield3 | backfield1 | backfield2 | backfield3 
------------+-------------+-------------+-------------+------------+------------+------------ 
      1 | a   | b   | c   | d   | e   | f 
      2 | x   | y   | z   | x   | y   | z  
+0

ах - да: профсоюз отлично работает. за ваше предложение. – kfmfe04

Смежные вопросы