2017-01-31 7 views
0

У меня есть эта реляционная схема для банковской базы данныхРеляционной алгебра Банковской базы данных

Customer(custid PK, name, city, streetaddr, province) 

Account(acctid PK, custid, atype, startdate, balance, branchid), (custid ref Customer, branchid ref Branch) 

Branch(branchid PK, mgrid, city, streetaddr, province), (mgrid ref Employees.empid) 

Employees(empid PK, name, branchid, salary, city, streetaddr, province), (branchid ref Branch) 

Transactions(tid PK, acctid, transtype, transdate, transamount, branchid) (acctid ref Account, branchid ref Branch) 

Я пытаюсь найти все «сбережение» счета идентификаторы, имя клиента, а также идентификаторы клиентов, клиентов, которые сделал только одну сделку в этом году

Очевидно, мне нужно использовать таблицы Сделки, Счета и Клиента. Я присоединился к Аккаунтам с транзакциями, чтобы увидеть все учетные записи, которые совершили одну или несколько транзакций, но у меня возникли проблемы с поиском спецификации «только одной» транзакции. Я чувствую, что мне нужно использовать разницу в настройках, но я все еще не могу это продумать.

+0

Просьба дать ссылку на то, что вы имеете в виду. Даже * отношения * отличаются не только операторами. Я ответил на ваш вопрос в SQL, но я могу дать версию RA, если вы сообщите о соответствующих понятиях отношений и операторов. – philipxy

ответ

1

Что-то вроде этого, может быть:

select a.acctid, c.custid, c.name 
from account a 
inner join (
    select acctid 
    from transactions 
    where year(transdate) = year(curdate()) 
    group by acctid 
    having count(tid) = 1 
) t on a.acctid = t.acctid 
inner join customer c 
on a.custid = c.custid 
where a.atype = 'savings'; 
0

Это invovles в "само- join". И да, мы используем заданную разницу ».

acctids где 1 сделка в году - это те, где есть некоторые транзакции MINUS те, где есть не менее 2. Первые находятся в Transactions. Последними являются те, где Transactions(tid, acctid, transtype, transdate, transamount, branchid) AND Transactions(tid2, acctid, transtype2, transdate, transamount2, branchid2) AND tid <> tid2. Т.е. в Transactions NATURAL JOIN RESTRICT tid <> tid2 RENAME tid\tid2, transtype\transtype2, transamount\transamount2, branchid\branchid2 Transactions. (Вы можете PROJECT прочь transtype, transamount, & branchid перед MINUS, а не RENAME их.)

Возможно самый простой в SQL является group сделок в этом году by acctid и выберите группы having count(tid) > 1. (Какой ответ @ GurV делает.)

Однако я обращусь к проблеме с поиском спецификации «только одной» транзакции ».

acctids где 1 сделка в году - это те, где есть транзакции минус те, где есть не менее 2. Первые находятся в Transactions. Последние относятся к числу t1.acctid с, где Transactions(t1.tid, ...) and Transactions(t2.tid, ...) and t1.tid <> t2.tid and t1.acctid = t2.acctid and t1.transdate = t2.transdate. Т.е. в Transactions t1 join Transactions t2 on t1.tid <> t2.tid and t1.acctid = t2.acctid where t1.transdate = t2.transdate.

select a.acctid, c.custname, c.custid 
from Transactions t 
and t.acctid not in (
    select t1.acctid 
    from Transactions t1 
    join Transactions t2 
    on t1.tid <> t2.tid 
    and t1.acctid = t2.acctid and t1.transdate = t2.transdate) 
join Account a on t.acctid = a.acctid 
join Customer c on a.custid = c.custid 
where a.atype = 'savings' 
and t.transdate = 2017 

Там нет SQL except в MySQL, но кроме in вы можете также использовать left join или not exists.

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

  • Нет связанных вопросов^_^