程序是填补" 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
感谢。
答案 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,并假设它是IDENTITY
和int
请参阅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