Выберите из нескольких таблиц, соответствующих нескольким критериям - PullRequest
0 голосов
/ 17 ноября 2009

Я работаю с 3 таблицами, пытаясь получить список, который соответствует определенным критериям. Мне нужен список компаний из таблицы компаний, у которых есть активная возможность (iactive равен 1 в таблице возможностей) И есть запись в таблице заметок типа order или order2.

 Companies Table
+------+------------------+
| cid  |     ccyname      |
+------+------------------+
| 1c   | Bobs Fish        |
| 2c   | Sheep Counters   |
| 3c   | Old Timers       |
| 4c   | Roasted Nuts     |
+------+------------------+

   Notes Table
+------+--------+--------+
| nid  |ntype   |cid     |
+------+--------+--------+
| 1n   | order  |3c      |
| 2n   | quest  |1c      |
| 3n   | order2 |2c      |
| 4n   | cancel |2c      |
+------+--------+--------+

Opportunities Table
+------+--------+--------+
| oid  |iactive | cid    |
+------+--------+--------+
| 1o   | 1      | 1c     |
| 2o   | 0      | 3c     |
| 3o   | 1      | 3c     |
| 4o   | 1      | 2c     |
+------+--------+--------+

В этом примере результаты должны быть:

     Results
+----------------+--------+
| ccyname        |  oid   |
+----------------+--------+
| Old Timers     | 3o     |
| Sheep Counters | 4o     |
+----------------+--------+

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

Я пытался построить это несколькими разными способами, но я всегда получаю только один результат или слишком много. Могу ли я получить помощь?

Это на SQL Server 2005.

Спасибо, John

Ответы [ 3 ]

1 голос
/ 17 ноября 2009
SELECT DISTINCT(ccyname), oid
FROM Companies AS c
INNER JOIN Notes AS n ON c.cid = n.cid
INNER JOIN Opportunities AS o ON c.cid = o.cid 
WHERE n.ntype IN ('order','order2')
AND o.iactive = 1;

Предупреждение: не проверено.

1 голос
/ 17 ноября 2009
SELECT
    C.ccyname, O.oid
FROM
    Companies C
    JOIN
    Opportunities O AND O.cid = c.cid
WHERE
    O.iactive = 1
    AND
    EXISTS (SELECT * FROM Notes N
        WHERE N.ntype IN ('order', 'order2') AND N.cid = c.cid)
0 голосов
/ 17 ноября 2009
SELECT DISTINCT cid, ccyname
FROM Companies c
INNER JOIN Notes n ON n.cid = c.cid AND n.ntype = 'order2' OR n.ntype = 'order'
INNER JOIN Opportunities o ON o.cid = c.cid AND o.iactive = 1
...