Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用其他表中的值更新列,可以';不要使用不同的函数_Sql Server_Join_Distinct - Fatal编程技术网

Sql server 使用其他表中的值更新列,可以';不要使用不同的函数

Sql server 使用其他表中的值更新列,可以';不要使用不同的函数,sql-server,join,distinct,Sql Server,Join,Distinct,我的原始数据在表2中。我从头开始创建了Table1。我这样填充了列A: INSERT INTO Table1("item") SELECT DISTINCT(Table2."item") FROM Table2 UPDATE Table1 SET totals = t2.q FROM Table1 INNER JOIN ( SELECT t2."item" , SUM(t2.quantity) AS q FROM t2

我的原始数据在表2中。我从头开始创建了Table1。我这样填充了列A:

INSERT INTO Table1("item")
SELECT DISTINCT(Table2."item")
FROM Table2
UPDATE Table1
SET totals = t2.q
    FROM Table1 INNER JOIN
    (
        SELECT t2."item"
        , SUM(t2.quantity) AS q
        FROM t2
        GROUP BY t2."item"
    ) AS t2
    ON Table1."item" = t2."item"
我填充了表1。总计(B列)如下:

INSERT INTO Table1("item")
SELECT DISTINCT(Table2."item")
FROM Table2
UPDATE Table1
SET totals = t2.q
    FROM Table1 INNER JOIN
    (
        SELECT t2."item"
        , SUM(t2.quantity) AS q
        FROM t2
        GROUP BY t2."item"
    ) AS t2
    ON Table1."item" = t2."item"
如何填充表1“日期”?我上面的更新在这里不起作用,因为我不能在日期上使用聚合函数。我能够在单独的查询中使用以下代码获得我想要的结果:

SELECT DISTINCT Table1."item"
, Table2."date"
FROM Table1 INNER JOIN Table2
ON Table1."item" = Table2."item"
ORDER BY Table1."item"

但是如何使用此查询的结果来设置列的值呢?我使用的是SQL Server 2008。

对于SQL Server,您可以使用一个
INSERT
语句:

INSERT INTO Table1(Item, Totals, [Date])
SELECT Item, SUM(Quantity), MIN([Date]) -- It could be MAX([Date])
FROM Table2
GROUP BY Item

如果您不能像@Lamak建议的那样重新插入,那么您可以通过以下方式执行
更新

UPDATE t1
  SET t1.Date = s.Date
  FROM Table1 AS t1
  INNER JOIN 
  (
    SELECT Item, [Date] = MAX([Date]) -- or MIN()
      FROM Table2
      GROUP BY Item
  ) AS s
  ON t1.Item = s.Item;

最简单的方法是使用简单的CTA(创建表作为选择):


您可以使用类似于中的select语句创建视图,而不是创建表。这样,您就不必在每次
表2
更新时更新新行集。

如果有多个日期,您应该选择什么日期?为什么不能在日期列上使用聚合函数?您需要解释您想要的日期。T-SQL中没有任何()或任意()函数。如果Orange有两个不同的日期会发生什么?另外,请不要在列名周围加双引号。使它很难阅读,而且还依赖于
QUOTED\u标识符
设置。看来我把事情搞得太复杂了,哈。这似乎符合我对B列的要求。您是否可能意外地切换了t1和t2?是的,对不起,通常表1在表2之前存在。我认为交换这些应该很容易。这成功地将我的要求填入了专栏,尽管现在我认为我最初的要求没有得到充分考虑。我将每天向表2中添加新数据,新数据将有一个新的日期。我想我需要弄清楚我计划如何准确地在表1中填写我需要的日期。所以你计划每天运行更新或其他数据移动操作?您是否考虑过视图,这样您就不必做这种繁重的工作,数据总是准确的,而不是在执行数据移动后立即进行?您将表向后移动(就像我一样),并且用户还说第二个表已经创建并填充。使用
SELECT INTO
时,可能会丢失目标表上已创建的内容(索引、约束、触发器、权限、某些依赖项等)。表2每天只更新一次,每条记录旁边都会有相应的日期。在我将新一天的记录附加到表2中之后,表1将被更新。这里真的需要风景吗?一旦更新了表2,我将向表1添加新数据。旧数据再也不会被碰了。@eek142:在这种情况下,您原来的方法(计算一次总数并将其存储在表格中)似乎更合适。