2012-03-05 3 views
0

Итак, у меня снова возникли проблемы.mySQL - использование инструкции OR

часть моего ERD им возникли проблемы запрашивание мой суперкласс суперкласс идет следующим образом:

питания (супер) без Surg (суб) хирургический (суб) наркотиков (суб)

первичный ключ «ORDERNUMBER»

сотрудник, который работает на отделении ставит в реквизиции для элемента, я хочу, чтобы просмотреть все элементы, которые следует заказывать вместе с датами пОЛУЧАЛ и упорядоченными всего не -фактурные предметы (из подкласс нехирургических и сур гический)

До сих пор у меня есть это:

SELECT requisition.ReqNumber, staff.staffnumber, ward.wardname, itemname 
FROM requisition, staff, supply, ward, ward_staff, req_supply, nonsurgical, surgical 
WHERE requisition.staffnumber = staff.staffnumber 
AND requisition.reqnumber = req_supply.reqnumber 
AND supply.ordernumber = req_supply.ordernumber 
AND staff.staffnumber = ward_staff.staffnumber 
AND ward_staff.wardnumber = ward.wardnumber 
AND supply.ordernumber = nonsurgical.ordernumber 
OR supply.ordernumber = surgical.ordernumber; 

Так в основном, если первичный ключ supercalss то же, что и в хирургическом ... ИЛИ же, что и в нехирургическом, покажи мне что реквизиция! проблема заключается в subcalss, но я потерял

Спасибо за любую помощь вы можете предложить

+0

Не знаете, почему вы упоминаете лекарство, оно не появляется в вашем запросе. – RedFilter

ответ

3

оператора ИЛИ имеет более низкий приоритет, чем оператор AND, так что вы должны использовать скобки для последних двух пунктов, в противном случае она будет достаточно, чтобы удовлетворить только последний пункт ИЛИ.

Итак:

SELECT requisition.ReqNumber, staff.staffnumber, ward.wardname, itemname 
FROM requisition, staff, supply, ward, ward_staff, req_supply, nonsurgical, surgical 
WHERE requisition.staffnumber = staff.staffnumber 
AND requisition.reqnumber = req_supply.reqnumber 
AND supply.ordernumber = req_supply.ordernumber 
AND staff.staffnumber = ward_staff.staffnumber 
AND ward_staff.wardnumber = ward.wardnumber 
AND (supply.ordernumber = nonsurgical.ordernumber 
OR supply.ordernumber = surgical.ordernumber); 
3

круглых скобок ИЛИ условие, чтобы получить порядок старшинства права.

... 
AND (supply.ordernumber = nonsurgical.ordernumber 
    OR supply.ordernumber = surgical.ordernumber); 
+0

Да, извините, я забыл, что, задавая вопрос, я сделал это, но я все еще повторяю 140 строк, пока у меня есть только 20 заявок, а 14 из них либо хирургические, либо нехирургические (остальные 6 - заявки на наркотики) – Phil

+0

@ Фил. Если вам нужна только одна строка для каждой заявки, вы должны упомянуть об этом в своем вопросе. Ваш запрос возвращает хотя бы одну строку за элемент поставки, а также дополнительные дополнительные строки из других объединений. – RedFilter

1

У меня были аналогичные проблемы с несколькими И пунктами и окончательное ИЛИ пункте, попытайтесь вокруг двух Ored положения в круглых скобках.

SELECT requisition.ReqNumber, staff.staffnumber, ward.wardname, itemname 
FROM requisition, staff, supply, ward, ward_staff, req_supply, nonsurgical, surgical 
WHERE requisition.staffnumber = staff.staffnumber 
AND requisition.reqnumber = req_supply.reqnumber 
AND supply.ordernumber = req_supply.ordernumber 
AND staff.staffnumber = ward_staff.staffnumber 
AND ward_staff.wardnumber = ward.wardnumber 
AND 
(supply.ordernumber = nonsurgical.ordernumber 
    OR supply.ordernumber = surgical.ordernumber); 
1

Ну, ваша главная проблема заключается в том, что вы используете сложный синтаксис прямого соединения. Из-за этого вы эффективно используете левое соединение.

SELECT r.ReqNumber, 
    St.staffnumber, 
    w.wardname, itemname 
FROM requisition r 
     Inner join   staff st 
     On r.staffnumber = st.staffnumber 
     Inner join req_supply rs 
     On r.reqnumber = rs.reqnumber 
     Inner join supply su 
     On su.ordernumber = rs.ordernumber 
     Inner join ward_staff wst 
     On wst.staffnumber = st.staffnumber 
     Inner join ward w 
     On w.wardnumber = wst.wardnumber 
     Inner join nonsurgical  nsr 
     On su.ordernumber = nsr.ordernumber 
     Left join surgical sr 
     On su.ordernumber = sr.ordernumber ; 
Смежные вопросы