{"id":4268,"date":"2010-02-20T16:35:42","date_gmt":"2010-02-20T15:35:42","guid":{"rendered":"http:\/\/www.glorf.it\/blog\/?p=4268"},"modified":"2010-02-20T17:20:38","modified_gmt":"2010-02-20T16:20:38","slug":"die-tabelle-ist-mehrdeutig","status":"publish","type":"post","link":"http:\/\/www.glorf.it\/blog\/2010\/02\/20\/sql-talk\/die-tabelle-ist-mehrdeutig","title":{"rendered":"Die Tabelle ist mehrdeutig"},"content":{"rendered":"<p>Als mir mein Kollege Thomas ein Problem pr&#228;sentierte, musste ich erst mal lange &#252;berlegen. Grund genug das hier festzuhalten, falls es auch anderen so geht. Im UPDATE-Befehl kann man einen JOIN auf eine andere Tabelle machen. Der UPDATE wird aber dennoch nur auf die Basistabelle durchgef&#252;hrt. Bei einem Self-Join kann dabei ein Fehler kommen:<\/p>\n<p><code lang=\"sql\">UPDATE test<br \/>\n\tSET fill= t2.fill<br \/>\nFROM test AS t1<br \/>\nJOIN test as t2<br \/>\n\tON t1.refid=t2.id<\/code><\/p>\n<blockquote><p>Meldung 8154, Ebene 16, Status 1, Zeile 1<br \/>\nDie &#x0027;test&#x0027;-Tabelle ist mehrdeutig.<\/p><\/blockquote>\n<p>Oder auf englisch: &quot;The table &#x0027;%.*s&#x0027; is ambiguous.&quot; Die L&#246;sung besteht darin, dass man im UPDATE &#252;ber den Alias deutlich macht, auf welche Tabelle der UPDATE durchgef&#252;hrt werden soll. Beispielsweise so:<\/p>\n<p><code lang=\"sql\">UPDATE t1 \/* <-- Hier den Alias verwenden *\/\n\tSET fill= t2.fill\nFROM test AS t1\nJOIN test as t2\n\tON t1.refid=t2.id\t\t<\/code><\/p>\n<p>Das gilt freilich auch f&#252;r ein DELETE-FROM.<\/p>\n<p>Hier noch der Code f&#252;r ein schnelles Repro:<br \/>\n<code lang=\"sql\">USE tempdb<br \/>\nGO<br \/>\nIF object_id (&#x0027;test&#x0027;) IS NULL<br \/>\n\tCREATE TABLE test (<br \/>\n\t\tid\tINTEGER\tNOT NULL PRIMARY KEY,<br \/>\n\t\tname\tNVARCHAR(100) NOT NULL,<br \/>\n\t\trefid\tINTEGER NULL REFERENCES test(id),<br \/>\n\t\tfill\tINTEGER NULL);<br \/>\nELSE<br \/>\n\tDELETE FROM test;\t<\/p>\n<p>INSERT INTO test (id, name, refid, fill)<br \/>\n\tSELECT  1, N&#x0027;Bill&#x0027;, NULL, 10\t\t\tUNION ALL<br \/>\n\tSELECT  2, N&#x0027;Bob&#x0027;,  NULL, 20\t\t\tUNION ALL<br \/>\n\tSELECT  3, N&#x0027;Hank&#x0027;, NULL, 30\t\t\tUNION ALL<br \/>\n\tSELECT  4, N&#x0027;Tom&#x0027;,  1,    NULL\t\t\tUNION ALL<br \/>\n\tSELECT  5, N&#x0027;Babs&#x0027;, 1,    NULL\t\t\tUNION ALL<br \/>\n\tSELECT  6, N&#x0027;Grit&#x0027;, 1,    NULL\t\t\tUNION ALL<br \/>\n\tSELECT  7, N&#x0027;Alex&#x0027;, 2,    NULL\t\t\tUNION ALL<br \/>\n\tSELECT  8, N&#x0027;Eric&#x0027;, 2,    NULL\t\t\tUNION ALL<br \/>\n\tSELECT  9, N&#x0027;Stan&#x0027;, 2,    NULL\t\t\tUNION ALL<br \/>\n\tSELECT 10, N&#x0027;Ole&#x0027;,  2,    NULL\t\t\tUNION ALL<br \/>\n\tSELECT 11, N&#x0027;Skye&#x0027;, 3,    NULL\t\t\tUNION ALL<br \/>\n\tSELECT 12, N&#x0027;Mary&#x0027;, 3,    NULL\t\t\tUNION ALL<br \/>\n\tSELECT 13, N&#x0027;Joe&#x0027;,  3,    NULL\t\t\tUNION ALL<br \/>\n\tSELECT 14, N&#x0027;Kurt&#x0027;, 3,    NULL\t\t\tUNION ALL<br \/>\n\tSELECT 15, N&#x0027;Karl&#x0027;, 3,    NULL;<br \/>\nGO<br \/>\nUPDATE test<br \/>\n\tSET fill= t2.fill<br \/>\nFROM test AS t1<br \/>\nJOIN test as t2<br \/>\n\tON t1.refid=t2.id<br \/>\n\/*<br \/>\nMeldung 8154, Ebene 16, Status 1, Zeile 1<br \/>\nDie &#x0027;test&#x0027;-Tabelle ist mehrdeutig.<br \/>\n*\/<br \/>\nGO<br \/>\nUPDATE t1<br \/>\n\tSET fill= t2.fill<br \/>\nFROM test AS t1<br \/>\nJOIN test as t2<br \/>\n\tON t1.refid=t2.id\t\t<\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Als mir mein Kollege Thomas ein Problem pr&#228;sentierte, musste ich erst mal lange &#252;berlegen. Grund genug das hier festzuhalten, falls es auch anderen so geht. Im UPDATE-Befehl kann man einen JOIN auf eine andere Tabelle machen. Der UPDATE wird aber dennoch nur auf die Basistabelle durchgef&#252;hrt. Bei einem Self-Join kann dabei ein Fehler kommen: UPDATE [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[685,686],"_links":{"self":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/4268"}],"collection":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/comments?post=4268"}],"version-history":[{"count":11,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/4268\/revisions"}],"predecessor-version":[{"id":4322,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/4268\/revisions\/4322"}],"wp:attachment":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/media?parent=4268"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/categories?post=4268"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/tags?post=4268"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}