循环遍历表,使用条件,然后将值存储在另一个表中

时间:2014-04-07 14:49:43

标签: sql sql-server

程序是填补" City"表B中的列基于" Letter"表A中的列。

表A

+----------+-------+  
|  Number  | Letter|  
+----------+-------+  
| 1        |   A   |  
| 1        |       |  
| 1        |       |  
| 2        |       |  
| 2        |       |  
| 3        |       |  
| 3        |   B   |
| 3        |       |
| 3        |   C   |  
+----------+-------+  

表B

+----------+-------+  
|    AC    |  City |  
+----------+-------+  
| 1        |   A   |  
| 1        |   A   |  
| 1        |   A   |  
| 1        |   A   |  
| 2        |       |  
| 2        |       |  
| 2        |       |  
| 2        |       |  
| 3        |   B   |  
| 3        |   B   |  
| 3        |   B   |  
+----------+-------+  

如果AC = 1,请参考Number = 1,并循环显示" Letter"从上到下的值可获得最高价值。

对于Number = 1,最高值为A,因此对于AC = 1,请填写所有" City"列为A。

对于AC = 2,Number = 2,并且表A中没有值,因此请填写所有" City"每个AC = 2为空白。

对于AC = 3,Number = 3,最高值为B,因此请填写所有" City"每个AC = 3为B。

如何在标准SQL中编写代码?

我正在使用Caspio软件,并将SQL插入到" City"列本身,但不应该过多地干扰代码。

这是我到目前为止所做的:

SELECT Letter
FROM TableA 
WHERE TableA.Number = TableB.AC
AND TableA.Number != ""
LIMIT 1

但它似乎没有起作用,我认为有必要循环通过表A来查找每个AC = Number的City值。

感谢您的帮助。

修改

我已经找到了解决方案:

SELECT TOP 1 Letter
FROM TableA
WHERE Letter !='' AND Number=AC

感谢。

2 个答案:

答案 0 :(得分:0)

它不起作用,因为您没有在FROM子句中包含表或加入它。你可以尝试这个:

    SELECT Letter FROM TableA WHERE Number IN 
(SELECT AC FROM TableB WHERE City!='' AND City IS NOT NULL)
AND Letter!='' AND LETTER IS NOT NULL

答案 1 :(得分:0)

首先,不要在SQL中考虑“循环”,这意味着您正在考虑错误的问题。您可以使用基于集合的思维。

所以想想你想做什么,而不是你想怎么做。

您想要update the TableB.City based on the value of TableA.Letter

UPDATE TableB
SET City = Letter
FROM
(
    SELECT Number, Letter,ROW_NUMBER () OVER ( PARTITION BY Number order by number ) AS SortOrder
    FROM TableA
    WHERE Letter IS NOT NULL AND Letter != ''
) AS A
WHERE A.SortOrder = 1 AND TableB.AC = A.number

我已经包含Row_Number排序,这是为了确保您获得第一个字母。请注意,您应该通过PK订购,假设您有PK,并假设它是IDENTITYint

请参阅sqlFiddle

修改 当然,你可以做一个选择。

SELECT TableB.AC, A.Letter
FROM
(
    SELECT Number, Letter,ROW_NUMBER () OVER ( PARTITION BY Number order by number ) AS SortOrder
    FROM TableA
    WHERE Letter IS NOT NULL AND Letter != ''
) AS A
    LEFT OUTER JOIN TableB.AC = A.number
WHERE A.SortOrder = 1