我有三张桌子......
create table customers (
customerID integer unsigned not null auto_increment,
customername varchar(45) not null,
address varchar(45) not null,
city varchar(45) not null,
state varchar(2) not null,
zip mediumint(5) zerofill not null,
primary key (customerID)
);
create table products (
prodID integer unsigned not null auto_increment,
prodname varchar(45) not null,
prodcat integer unsigned,
proddesc varchar(75) not null,
price float (8,2),
qoh integer not null,
prodiconurl varchar(45),
primary key (prodID),
constraint FK_CAT foreign key FK_CAT (prodcat)
references categories (catID)
on delete restrict
on update restrict
);
create table SHOPPING_CART (
CustomerID INTEGER UNSIGNED NOT NULL,
ProductID INTEGER UNSIGNED NOT NULL,
ProdQnty INTEGER UNSIGNED NOT NULL,
Primary Key (CustomerID, ProductID),
CONSTRAINT Fk_Cust Foreign Key Fk_Cust (CustomerID)
References Customers (CustID)
On Delete restrict
On Update restrict,
CONSTRAINT Fk_Prod Foreign Key Fk_Prod (ProductID)
References Products (ProdID)
On Delete restrict
On Update restrict
);
表格很好。我遇到问题的是我对SHOPPING_CART的SELECT语句。如果我插入以下代码。
insert into SHOPPING_CART
Values (
1, 4, 2
);
insert into SHOPPING_CART
values (
1, 9, 1
);
我的内部联接不适用于查找CustID,从Customers表返回FirstName和LastName字段,并根据购物车表中的值从Products表返回产品名称。
这是我的最终目标。
SELECT
Customers.FirstName,
Customers.LastName,
Products.Name,
SHOPPING_CART.ProdQnty
FROM SHOPPING_CART
inner join Customers on SHOPPING_CART.CustomerID = Customers.CustID
where Customers.CustID = SHOPPING_CART.CustomerID
inner join Products on SHOPPING_CART.ProductID = Products.ProdID
where Products.ProdID = SHOPPING_CART.ProductID;
当第二个内连接是语句的一部分时,我得到一个语句错误,该语句在第二个内连接上有一个红色的x。
答案 0 :(得分:2)
只需要1个where语句。第二个where语句将在“AND”语句下面。注意:代码是ANSI-92之前的版本。有关如何使用ANSI-92的说明遵循代码示例。
SELECT
Customers.FirstName,
Customers.LastName,
Products.Name,
SHOPPING_CART.ProdQnty
FROM SHOPPING_CART
WHERE Customers.CustID = SHOPPING_CART.CustomerID
AND Products.ProdID = SHOPPING_CART.ProductID;
<强>历史:强>
在ANSI 92之前,where语句中的连接很常见。标准化之后,连接从where语句移动到from语句。 where语句用于提供额外的过滤能力,例如status ='open'。以下摘录解释了ANSI-92连接语法。
ANSI连接语法在ANSI SQL-92标准出台之前 新的连接语法,关系(表,视图等)在中被命名 FROM子句,以逗号分隔。加入条件在中指定 WHERE子句:
=&GT; SELECT * FROM T1,T2 WHERE T1.id = T2.id; ANSI SQL-92标准提供了更具体的连接语法,其中的连接条件在 ON子句:
=&GT; SELECT * FROM T1 [INNER | LEFT OUTER |右外| FULL OUTER |天然| CROSS] JOIN T2 ON T1.id = T2.id参见SQL-99 ANSI 有关其他详细信息,请参阅BNF Grammar for SQL-99的语法。
<强>优点:强>
SQL-92外连接语法可跨数据库移植;年纪大了 语法在数据库之间不一致。 SQL-92语法提供了更好的控制 谓词将在外连接期间或之后进行评估。这是 使用旧语法时,数据库之间也不一致。看到 “加入条件与过滤条件”如下。 SQL-92语法 在一些情况下,按照评估连接的顺序消除歧义 其中两个以上的表与外连接连接在一起。联盟加入 可以使用SQL-92语法表示,但不能用较旧的语法表示。
包含ANSI-92的更新查询:
SELECT
Customers.FirstName,
Customers.LastName,
Products.Name,
SHOPPING_CART.ProdQnty
FROM SHOPPING_CART
inner join Customers on SHOPPING_CART.CustomerID = Customers.CustID
inner join Products on SHOPPING_CART.ProductID = Products.ProdID
答案 1 :(得分:2)
如果您使用JOIN,那么您不需要在哪里。
您的请求将是
SELECT
Customers.FirstName,
Customers.LastName,
Products.Name,
SHOPPING_CART.ProdQnty
FROM SHOPPING_CART
INNER JOIN Customers ON SHOPPING_CART.CustomerID = Customers.CustomerID
INNER JOIN Products on SHOPPING_CART.ProductID = Products.ProdID
我在代码中的on子句中发现了一个错误。您对表Customers使用了CustID。但是在您的create table中,这个字段是CustomerID。不知道哪里出错了 - 只是写了你的结构请求。