MySQL - использование оператора OR - PullRequest
0 голосов
/ 05 марта 2012

Хорошо, у меня снова проблемы.

часть моего 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;

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

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

Ответы [ 4 ]

3 голосов
/ 05 марта 2012

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

Итак:

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 голосов
/ 05 марта 2012

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

...
AND (supply.ordernumber = nonsurgical.ordernumber
  OR supply.ordernumber = surgical.ordernumber);
1 голос
/ 05 марта 2012

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

 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 ;
1 голос
/ 05 марта 2012

У меня были похожие проблемы с несколькими предложениями AND и последним предложением OR, попробуйте заключить два предложения 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...