Sql 在Oracle 11g中显示来自多个表的数据

Sql 在Oracle 11g中显示来自多个表的数据,sql,oracle11g,subquery,Sql,Oracle11g,Subquery,问题 我想显示来自不同表的数据组合。在这种情况下,所有食物和饮料的组合,目前尚未订购 我的数据库表 客户订单 Orderno(PK) DateOrd DateReq Address O00001 03-Apr-11 07-Apr-11 Union St O00002 05-Apr-11 01-May-11 St. Andrew St. O00003 12-Apr-11 27-Apr-11 Garthdee O00004 1

问题

我想显示来自不同表的数据组合。在这种情况下,所有食物和饮料的组合,目前尚未订购

我的数据库表

客户订单

Orderno(PK)  DateOrd    DateReq    Address
O00001       03-Apr-11  07-Apr-11  Union St
O00002       05-Apr-11  01-May-11  St. Andrew St.
O00003       12-Apr-11  27-Apr-11  Garthdee
O00004       12-Apr-11  17-Apr-11  Union St.
Food_orderno(PK)  Orderno(FK)  Dishid(FK)  NPortions
FO00001           O00001       D0003         6
FO00002           O00001       D0001         4
FO00003           O00001       D0004         3
FO00004           O00002       D0001        10
FO00005           O00002       D0002        10
FO00006           O00003       D0002        35
FO00007           O00004       D0002        23
Drinkorderid(PK)  Orderid(FK)  Drinkid(FK)  N_units
DO00001           O00001       DR0001       13
DO00002           O00001       DR0002       13
DO00003           O00001       DR0004       13
DO00004           O00002       DR0001       20
DO00005           O00002       DR0003       20
DO00006           O00002       DR0004       15
DO00007           O00003       DR0002       35
DO00008           O00004       DR0001       23
DO00009           O00004       DR0003       15
DO00010           O00004       DR0004       15
select distinct d.dish_name, dr.drink_name
from Dish d, Drink dr, Food_order fo, Drink_order dro, Customer_order co
where co.orderno = fo.orderno
  AND co.orderno = dro.orderno
order by dish_name, drink_name;

select d.dish_name, dr.drink_name
from Dish d, Drink dr, Food_order fo, Drink_order dro, Customer_order co
where co.orderno = fo.orderno
  AND co.orderno = dro.orderno
group by d.dish_name, dr.drink_name;

select distinct d.dish_name, dr.drink_name
from Dish d, Drink dr, Food_order fo, Drink_order dro, Customer_order co
where d.dishid = fo.DISHID
  AND dr.DRINKID = dro.DRINKID
  AND fo.ORDERNO = dro.ORDERNO
group by d.dish_name, dr.drink_name;

select distinct d.dish_name, dr.drink_name
from dish d, drink dr, food_order fo, drink_order do
where fo.ORDERNO = do.ORDERNO
group by d.dish_name, dr.drink_name;
盘子

Dishid(PK)  DishName         Vegetarian   Price
D0001       Pasta bake       yes           6.00
D0002       Fish pie         No            9.00
D0003       Steak and chips  No           14.00
D0004       Stuffed peppers  yes          11.50
D0005       Ham and rice     No            7.25
D0006       Lamb curry       No            8.50
喝酒

Drinkid(PK)  DrinkName    DrinkType  Price
DR0001       Water        soft        1.00
DR0002       Coffee       hot         1.70
DR0003       Wine         alcoholic   3.00
DR0004       Beer         alcoholic   2.30
DR0005       tea          hot         1.50
食物\u订单

Orderno(PK)  DateOrd    DateReq    Address
O00001       03-Apr-11  07-Apr-11  Union St
O00002       05-Apr-11  01-May-11  St. Andrew St.
O00003       12-Apr-11  27-Apr-11  Garthdee
O00004       12-Apr-11  17-Apr-11  Union St.
Food_orderno(PK)  Orderno(FK)  Dishid(FK)  NPortions
FO00001           O00001       D0003         6
FO00002           O00001       D0001         4
FO00003           O00001       D0004         3
FO00004           O00002       D0001        10
FO00005           O00002       D0002        10
FO00006           O00003       D0002        35
FO00007           O00004       D0002        23
Drinkorderid(PK)  Orderid(FK)  Drinkid(FK)  N_units
DO00001           O00001       DR0001       13
DO00002           O00001       DR0002       13
DO00003           O00001       DR0004       13
DO00004           O00002       DR0001       20
DO00005           O00002       DR0003       20
DO00006           O00002       DR0004       15
DO00007           O00003       DR0002       35
DO00008           O00004       DR0001       23
DO00009           O00004       DR0003       15
DO00010           O00004       DR0004       15
select distinct d.dish_name, dr.drink_name
from Dish d, Drink dr, Food_order fo, Drink_order dro, Customer_order co
where co.orderno = fo.orderno
  AND co.orderno = dro.orderno
order by dish_name, drink_name;

select d.dish_name, dr.drink_name
from Dish d, Drink dr, Food_order fo, Drink_order dro, Customer_order co
where co.orderno = fo.orderno
  AND co.orderno = dro.orderno
group by d.dish_name, dr.drink_name;

select distinct d.dish_name, dr.drink_name
from Dish d, Drink dr, Food_order fo, Drink_order dro, Customer_order co
where d.dishid = fo.DISHID
  AND dr.DRINKID = dro.DRINKID
  AND fo.ORDERNO = dro.ORDERNO
group by d.dish_name, dr.drink_name;

select distinct d.dish_name, dr.drink_name
from dish d, drink dr, food_order fo, drink_order do
where fo.ORDERNO = do.ORDERNO
group by d.dish_name, dr.drink_name;
点饮料

Orderno(PK)  DateOrd    DateReq    Address
O00001       03-Apr-11  07-Apr-11  Union St
O00002       05-Apr-11  01-May-11  St. Andrew St.
O00003       12-Apr-11  27-Apr-11  Garthdee
O00004       12-Apr-11  17-Apr-11  Union St.
Food_orderno(PK)  Orderno(FK)  Dishid(FK)  NPortions
FO00001           O00001       D0003         6
FO00002           O00001       D0001         4
FO00003           O00001       D0004         3
FO00004           O00002       D0001        10
FO00005           O00002       D0002        10
FO00006           O00003       D0002        35
FO00007           O00004       D0002        23
Drinkorderid(PK)  Orderid(FK)  Drinkid(FK)  N_units
DO00001           O00001       DR0001       13
DO00002           O00001       DR0002       13
DO00003           O00001       DR0004       13
DO00004           O00002       DR0001       20
DO00005           O00002       DR0003       20
DO00006           O00002       DR0004       15
DO00007           O00003       DR0002       35
DO00008           O00004       DR0001       23
DO00009           O00004       DR0003       15
DO00010           O00004       DR0004       15
select distinct d.dish_name, dr.drink_name
from Dish d, Drink dr, Food_order fo, Drink_order dro, Customer_order co
where co.orderno = fo.orderno
  AND co.orderno = dro.orderno
order by dish_name, drink_name;

select d.dish_name, dr.drink_name
from Dish d, Drink dr, Food_order fo, Drink_order dro, Customer_order co
where co.orderno = fo.orderno
  AND co.orderno = dro.orderno
group by d.dish_name, dr.drink_name;

select distinct d.dish_name, dr.drink_name
from Dish d, Drink dr, Food_order fo, Drink_order dro, Customer_order co
where d.dishid = fo.DISHID
  AND dr.DRINKID = dro.DRINKID
  AND fo.ORDERNO = dro.ORDERNO
group by d.dish_name, dr.drink_name;

select distinct d.dish_name, dr.drink_name
from dish d, drink dr, food_order fo, drink_order do
where fo.ORDERNO = do.ORDERNO
group by d.dish_name, dr.drink_name;

到目前为止尝试的查询

Orderno(PK)  DateOrd    DateReq    Address
O00001       03-Apr-11  07-Apr-11  Union St
O00002       05-Apr-11  01-May-11  St. Andrew St.
O00003       12-Apr-11  27-Apr-11  Garthdee
O00004       12-Apr-11  17-Apr-11  Union St.
Food_orderno(PK)  Orderno(FK)  Dishid(FK)  NPortions
FO00001           O00001       D0003         6
FO00002           O00001       D0001         4
FO00003           O00001       D0004         3
FO00004           O00002       D0001        10
FO00005           O00002       D0002        10
FO00006           O00003       D0002        35
FO00007           O00004       D0002        23
Drinkorderid(PK)  Orderid(FK)  Drinkid(FK)  N_units
DO00001           O00001       DR0001       13
DO00002           O00001       DR0002       13
DO00003           O00001       DR0004       13
DO00004           O00002       DR0001       20
DO00005           O00002       DR0003       20
DO00006           O00002       DR0004       15
DO00007           O00003       DR0002       35
DO00008           O00004       DR0001       23
DO00009           O00004       DR0003       15
DO00010           O00004       DR0004       15
select distinct d.dish_name, dr.drink_name
from Dish d, Drink dr, Food_order fo, Drink_order dro, Customer_order co
where co.orderno = fo.orderno
  AND co.orderno = dro.orderno
order by dish_name, drink_name;

select d.dish_name, dr.drink_name
from Dish d, Drink dr, Food_order fo, Drink_order dro, Customer_order co
where co.orderno = fo.orderno
  AND co.orderno = dro.orderno
group by d.dish_name, dr.drink_name;

select distinct d.dish_name, dr.drink_name
from Dish d, Drink dr, Food_order fo, Drink_order dro, Customer_order co
where d.dishid = fo.DISHID
  AND dr.DRINKID = dro.DRINKID
  AND fo.ORDERNO = dro.ORDERNO
group by d.dish_name, dr.drink_name;

select distinct d.dish_name, dr.drink_name
from dish d, drink dr, food_order fo, drink_order do
where fo.ORDERNO = do.ORDERNO
group by d.dish_name, dr.drink_name;

这似乎又回到了你的要求:

SELECT
  Dish.DishName,
  Dish.Dishid,
  Drink.DrinkName,
  Drink.Drinkid
FROM Dish
JOIN
  (SELECT
      Dishid
      , Drinkid
    FROM Dish
    CROSS JOIN Drink
    MINUS
    (SELECT
      Dishid
      , Drinkid
    FROM Food_order
    CROSS JOIN Drink_order
    WHERE Food_order.Orderno = Drink_order.Orderid
    )
  ) NotOrderedTogether
  ON Dish.Dishid = NotOrderedTogether.Dishid
JOIN Drink
  ON NotOrderedTogether.Drinkid = Drink.Drinkid
ORDER BY Dishname, Drinkname
;
查看它的实际操作:

正如评论中指出的,如果你添加大量的食物和饮料,结果集将会爆炸。在这种情况下,首先将
减号
分别应用于菜肴和饮料,然后将
交叉连接
应用于尽可能少的记录可能是有意义的


如果需要调整/进一步详细信息,请发表意见。

我不完全确定您想要什么:如果您的意思是要列出任何客户订单中未同时出现的所有菜肴和饮料组合,也许您可以将其添加到描述中。否则,请说出您想要什么。我感觉您不清楚是否需要在某个键上连接所有表以避免组合爆炸,而且您似乎没有尝试表达未在您的
WHERE
子句中订购的食物和饮料的组合。是的,您的权利。这正是我想要展示的。你有一种正确的感觉。我不知道我在做什么这就是为什么我在这里做得很好,你是一个传奇!这正是我想要它做的。但是,我不太明白为什么要使用连接。比如,如果我想从同一数据库中的不同表中提取数据,我只会使用例如SELECT d.DISH_name,dr.DRINK_name from DISH d,DRINK dr
from DISH d,Food_order FO,其中d.dishid=FO.dishid
也是一个连接。这只是一种不同的语法——Oracle在旧(er)版本中不支持显式的
JOIN
样式。明确的风格对许多人来说更具可读性。大多数情况下,结果集没有差异-条件的放置可能会产生影响,例如,如果非等联接发挥作用。再次非常感谢!完美的解决方案。完美的解释!5颗星,我的荣幸。顺便说一句:(需要),和(更详细);-)我不确定。我在这个论坛上真是个不速之客,不常问问题。这是我第一次在这个论坛上找到我的问题的有用答案。