我是SQL的新手,正在try 操作一些基本数据.我的方案是:

CREATE SCHEMA dannys_diner;
SET search_path = dannys_diner;

CREATE TABLE sales (
  "customer_id" VARCHAR(1),
  "order_date" DATE,
  "product_id" INTEGER
);

INSERT INTO sales
  ("customer_id", "order_date", "product_id")
VALUES
  ('A', '2021-01-01', '1'),
  ('A', '2021-01-01', '2'),
  ('A', '2021-01-07', '2'),
  ('A', '2021-01-10', '3'),
  ('A', '2021-01-11', '3'),
  ('A', '2021-01-11', '3'),
  ('B', '2021-01-01', '2'),
  ('B', '2021-01-02', '2'),
  ('B', '2021-01-04', '1'),
  ('B', '2021-01-11', '1'),
  ('B', '2021-01-16', '3'),
  ('B', '2021-02-01', '3'),
  ('C', '2021-01-01', '3'),
  ('C', '2021-01-01', '3'),
  ('C', '2021-01-07', '3');
 

CREATE TABLE menu (
  "product_id" INTEGER,
  "product_name" VARCHAR(5),
  "price" INTEGER
);

INSERT INTO menu
  ("product_id", "product_name", "price")
VALUES
  ('1', 'sushi', '10'),
  ('2', 'curry', '15'),
  ('3', 'ramen', '12');
  

CREATE TABLE members (
  "customer_id" VARCHAR(1),
  "join_date" DATE
);

INSERT INTO members
  ("customer_id", "join_date")
VALUES
  ('A', '2021-01-07'),
  ('B', '2021-01-09');

我想联接‘Sales’和‘Menu’表,将价格列重命名为‘Members_Points’,并应用更新操作该列中的数据,以便在‘product_name’为sushi时将值加倍.我try 了很多不同的方法,但总是遇到查询无法识别我的更新的错误.以下是我到目前为止得出的结论:

SELECT *
FROM
(
    SELECT *
    FROM dannys_diner.sales
    INNER JOIN dannys_diner.menu
    ON dannys_diner.sales.product_id = dannys_diner.menu.product_id) AS menu_w_sales
UPDATE menu_w_sales
SET price = (price * 2)
WHERE product_name = sushi
    AND customer_id = 'A';

我不知道是我的语法错误、我对先前别名(Menu_W_Sales)的引用是错误的,还是我没有正确地放置参数.有谁有主意吗?

推荐答案

我认为第一个问题是您不能更新子查询.

另一方面,如果要更新表,请确保使用以下语法:

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

在您的代码中混合了SELECT和UPDATE语句,这就是抛出错误的原因.

为了解决您的问题(或者至少try 这样做),我使用了"Case When"表达式,并添加了一个名为new_Price的列,这样您就可以看到该表达式是如何工作的.

select menu_w_sales.*, 
case when menu_w_sales.product_name = 'sushi' and customer_id = 'A' then price*2
end as new_price
from 
(SELECT *
    FROM dannys_diner.sales
    INNER JOIN dannys_diner.menu
    ON dannys_diner.sales.product_id = dannys_diner.menu.product_id) as menu_w_sales

以下是最终代码:

select menu_w_sales.*, 
case when menu_w_sales.product_name = 'sushi' and customer_id = 'A' then price*2 
else price
end as new_price
from 
(SELECT *
    FROM dannys_diner.sales
    INNER JOIN dannys_diner.menu
    ON dannys_diner.sales.product_id = dannys_diner.menu.product_id) as menu_w_sales

注意第二个代码中的"Else".

如果您不想添加额外的列,我认为最快的方法是使用Menu_w_sales.ColumnName来命名您想要的列(基本上除了价格列之外的所有列)

希望这就是你要找的东西!

Sql相关问答推荐

如何更改函数返回的列名?

JSON列之间的Postgr聚合

解析键-值对,根据值 Select ,并使用SQL创建新列

对非RUST源代码字符串使用`stringify!`,例如SQL查询

NULL-生成的列中连接的字符串的输入

查询每周数据(周一至周日),避免年度日期重叠

返回UPSERT中的旧行值

Redshift PL/pgSQL循环中的参数化列名

从另一个没有公共键的表中获取值来加入

如何解释 SQL Server 中的 Foxpro 语法?

如何从postgresql中的项目映射(关联数组)设置值?

SQL Server:时态表并在运行时添加计算列

如何使用SQL将患者平均分配给他们所在地区的doctor

如何使用Informix创建一个临时表,将数据从根表导入并使用筛选条件

使用给定的变量对在循环中执行更新语句

为什么 get_json_object() 无法从存储在 Hive SQL 表中的 JSON 中提取值?

使用 SAVE TRANSACTION 时 BEGIN 和 COMMIT 语句的数量不匹配

多列上的 SQL UNIQUE 约束 - 它们的组合必须是唯一的还是至少其中之一?

在整个递归级别上终止递归查询 - Postgres

判断每组的条件,并对最近的行进行排名?