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 drfrom DISH d,Food_order FO,其中d.dishid=FO.dishid
也是一个连接。这只是一种不同的语法——Oracle在旧(er)版本中不支持显式的JOIN
样式。明确的风格对许多人来说更具可读性。大多数情况下,结果集没有差异-条件的放置可能会产生影响,例如,如果非等联接发挥作用。再次非常感谢!完美的解决方案。完美的解释!5颗星,我的荣幸。顺便说一句:(需要),和(更详细);-)我不确定。我在这个论坛上真是个不速之客,不常问问题。这是我第一次在这个论坛上找到我的问题的有用答案。