SQL INSERT INTO WITH SELECT查询

时间:2015-06-18 09:08:56

标签: sql sql-server select insert-into

没有经验的SQL,我希望有人可以帮助我。

我有一个空的临时表,以及一个包含信息的表。

我的查询概要如下:

CREATE TABLE [#Temp] (ID Int, Field1 Varchar)

INSERT INTO [#Temp]
    SELECT ID, Field1 
    FROM [Other_table] 
    WHERE ID IN (ID1, ID2, ID3...)

所以我将大量ID传递给查询,并且ID对应Other_table中的ID,它必须使用此信息填充临时表。

是否可以在同一查询中保存与其他位置不匹配的ID(比如另一个临时表)?或者对于同一个临时表,在这种情况下只有Field1 = NULL?

我需要对未匹配的ID做额外的工作,所以我需要在某处随时访问它们。我希望在这一个查询中完成所有操作,如果这是最快的方式。

编辑:

感谢您的帮助。

道歉,我现在看到我的问题并不完全清楚。

如果Other_table包含ID 1 - 1000,并且我传入了ID 999,1000和1001,我希望临时表包含999和1000的信息,然后是ID = 1001且Field1 = NULL的条目。我不希望ID 1 - 998返回,Field1 = NULL。

3 个答案:

答案 0 :(得分:5)

每个insert语句只能使用一个目标表。因此,将field1保持为null似乎是最简单的方法:

INSERT INTO [#Temp]
SELECT ID, CASE WHEN ID IN (ID1, ID2, ID3...) THEN Field1 END
FROM [Other_table] 

case语句将返回null id,ID不在列表中。

<强>更新
更新问题后,我建议这样做: 首先,将您在in运算符中使用的ID列表插入另一个临时表:

create table #tempIDs (id int)
insert into #tempIDs values(id1), (id2), (id3), ....

然后只使用一个简单的左连接:

INSERT INTO [#Temp]
SELECT t1.ID, Field1 
FROM #tempIDs t1 
LEFT JOIN [Other_table] t2 ON(t1.id = t2.id)

答案 1 :(得分:3)

您必须为 NOT IN ID

创建其他查询
var result = {
    "key-1": "value-1",
    "key-2": "value-2",
    "key-3": {
        "key-31": "value-31",
        "key-32": "value-32",
        "key-33": ["value-331", "value-332", "value-333"],
        "key-34": {
            "key-341": 341,
            "key-342": 342,
            "key-343": [3431],
            "key-344": true,
            "key-345": false,
            "key-346": {
                "key-3461": [3461, "value-3462", true, false]
            }
        }
    },
    "key-4": "value-4",
    "key-5": ["value-51", "value-52"],
    "key-6": {
        "key-61": "value-61",
        "key-62": ["value-621", "value-622"],
        "key-63": {
            "key-631": "value-631",
            "key-632": true,
            "key-633": false
        }
    },
    "key-7": function() {
        console.log("I am a function...");
    }
};

var tabCount = 0,
    typeMap = {
        "STRING": "[object String]",
        "NUMBER": "[object Number]",
        "BOOLEAN": "[object Boolean]",
        "ARRAY": "[object Array]",
        "OBJECT": "[object Object]",
        "FUNCTION": "[object Function]"
    },
    getTypeOfObject = function(o) {
        return Object.prototype.toString.call(o);
    },
    getTabSpacing = function(numberOfTabs) {
        var tab = "&nbsp;&nbsp;&nbsp;&nbsp;",
            result = "";
        for(var index = 0; index < numberOfTabs; index++) {
            result += tab;
        }
        return result;
    },
    iterator = function(obj, tab) {
        $.each(obj, function(key, value) {
            if(getTypeOfObject(value) === typeMap.OBJECT) {
                $("div").append(getTabSpacing(tab) + key + ":<br/>");
                iterator(value, ++tabCount);
                --tabCount;
            }
            else {
                $("div").append(getTabSpacing(tab) + key + ": " + value + "<br/>");
            }
        });    
    };

iterator(result, tabCount);

和其他一个

SELECT ID, Field1 
into #temp1
FROM [Other_table] WHERE ID NOT IN (ID1, ID2, ID3...)

这是什么意思我需要对未匹配的ID进行额外的工作?你可以添加更多细节,也许我们可以在一个查询中完成它而不是单独的

<强>更新

(ID1,ID2,ID3 ......)来自哪里?我们可以使用加入吗?如果你的答案是

,那么你会得到你想要的东西

试试这个

SELECT ID, Field1 
into #temp2
FROM [Other_table] WHERE ID IN (ID1, ID2, ID3...)

或者

SELECT *  Into #temp 
FROM(
  SELECT ID, Field1 
  FROM [Other_table] 
  WHERE ID IN (ID1, ID2, ID3...)
  Union
  SELECT ID, Field1 
  FROM [Other_table] 
  WHERE ID NOT IN (ID1, ID2, ID3...)
)

答案 2 :(得分:3)

对现有解决方案的最快解决方法是从其他表中获取临时表中不存在的所有值。我已将所有这些ID标记为Field1为NULL。

CREATE TABLE [#Temp] (ID Int, Field1 Varchar)

INSERT INTO [#Temp]
    SELECT ID, Field1 
    FROM [Other_table] 
    WHERE ID IN (ID1, ID2, ID3...)

INSERT INTO [#Temp]
SELECT ID, NULL AS Field1
FROM [Other_Table]
WHERE ID NOT IN (SELECT DISTINCT ID FROM #Temp)

其他方法是将它包含在同一个INSERT语句中

CREATE TABLE [#Temp] (ID Int, Field1 Varchar(100))

INSERT INTO [#Temp]
    SELECT ID, 
        CASE WHEN ID IN (ID1,ID2....) THEN Field1
             ELSE NULL END AS 'Field1'
    FROM [Other_Table]