2013-09-10 5 views
0

Я новичок в stackoverflow, поэтому, пожалуйста, будьте нежны. У меня серьезные проблемы с синтаксисом моего SQL. Суть в том, что я хочу скопировать из одной таблицы в другую без дубликатов. Я собирался сравнить два поля и только вставить, если в поле назначения1 есть NULL для поля1.Синтаксис SQL - LEFT JOIN

Пожалуйста, знайте, что я новичок в операторах SQL, поэтому любое расширенное знание было бы полезно ... например, я могу использовать переменные. Я получил исходное заявление из исследования stackoverflow, но не смог его завершить.

Вот что у меня есть, и спасибо за помощь:

INSERT INTO destinationTB 
SELECT sourceTB.field1, destinationTB.field1 
FROM sourceTB 
LEFT JOIN destinationTB 
ON sourceTB.field1 = destinationTB.field1 
WHERE destinationTB.field1 IS NULL; 

----- REVISED ВОПРОС -----

Спасибо за советы! Я постараюсь пересмотреть вопрос (и будущие вопросы), чтобы быть более понятным, и мои извинения за неуклюжий запах «нового ребенка» в моем последнем вопросе.

Конечным результатом, который я ищу, является копирование из одной таблицы в другую без дубликатов. Есть две таблицы, с которыми я работаю. Первый - это destinationTB, который имеет четыре поля, только один из которых я хотел бы заполнить. Вторая таблица - sourceTB, которая имеет несколько полей, но только одна из которых мне нужна для получения информации. Мой план состоял в том, чтобы запустить INSERT в destinationTB. Поскольку первое значение не было там, оно должно отчитываться как NULL. После того, как первая вставка была выполнена, и строка все еще работала с теми же значениями, которые существовали в настоящее время, она больше не будет сообщать NULL и будет двигаться дальше, пока не найдет другое значение, которое не было в целевом ТБ.

В качестве примера возьмем телевизор. Существует несколько разных производителей телевизоров. В этом примере мы скажем, что у нас есть SHARP-32in, SHARP-45in и SHARP-60in. Я хочу, чтобы destinationTB имел только один экземпляр SHARP (хотя в sourceTB есть три экземпляра.Так что я пытался сравнить destinationTB.manufacturer с sourceTB.manufacturer, используя этот оператор JOIN. Когда я запускаю этот запрос, который я буду вставлять после этот пункт, он возвращает все три экземпляра, так что я в конечном итоге с тремя SHARP значениями в моей destinationTB

вот мой последний, который я пытался на основе от ваших предложений:.

INSERT INTO destnationTB (field1) 
SELECT sourceTB.field1 
FROM sourceTB 
LEFT JOIN destinationTB ON sourceTB.field1 = destinationTB.field1 
WHERE destinationTB.field1 IS NULL; 
+0

Я ответил на аналогичный вопрос некоторое время назад почитайте этот ответ, и если у вас есть вопросы опубликовать обновление. См. Эту ссылку http://stackoverflow.com/questions/13869475/is-there-any-way-to-check-whether-or-not-the-query-inside-a-mysql-trigger-return/13875059#13875059 – Namphibian

+0

О, да, добро пожаловать в SO, а не в плохую попытку первого вопроса, но предоставляем немного больше информации о том, где ваши проблемы лежат. – Namphibian

+1

Вы используете MySQL или SQL Server? Этот вопрос отмечен как оба. –

ответ

0

кажется, вы пытаетесь для вставки двух полей field1, тогда как таблица назначения имеет только одну. Она должна быть:

INSERT into destinationTB 
    SELECT sourceTB.field1 
    FROM sourceTB 
    LEFT JOIN destinationTB ON sourceTB.field1 = destinationTB.field1 
    WHERE destinationTB.field1 IS NULL; 

Разверните соответствующее поле, которое должно быть вставлено. Если ваш синтаксис становится слишком сложным вы можете прибегнуть к временным таблицам тоже:

CREATE TEMPORARY TABLE tempTB as 
    SELECT sourceTB.field1 
    FROM sourceTB 
    LEFT JOIN destinationTB ON sourceTB.field1 = destinationTB.field1 
    WHERE destinationTB.field1 IS NULL; 

    INSERT into destinationTB 
    SELECT tempTB.field1 
    FROM tempTB ; 

временные таблицы действительно исчезают после выполнения запросов.

+0

Ваше первое объяснение помогло мне понять это немного лучше. Когда я использовал оператор, вначале я получил ошибку: «Количество столбцов не соответствует количеству значений в строке 1», поэтому я добавил в поле, в которое я хотел вставить. INSERT INTO destnationTB (поле1) ВЫБОР sourceTB.field1 ОТ sourceTB LEFT JOIN destinationTB ПО sourceTB.field1 = destinationTB.field1 ГДЕ destinationTB.field1 IS NULL; – usafitz

0

Я собираюсь сделать несколько широких обобщений по этому вопросу. Я предполагаю, что поле1 является PK на sourceTB и destinationTB и является единственным полем. Если конечная цель состоит в том, чтобы просто объединить две таблицы, это должно иметь нулевой эффект когда-либо, потому что если destinationTB.field1 IS NULL, то destinationTB.field1 будет НИКОГДА не будет равным ни одному, включая другой NULL. Вы ищете ВЗГЛЯД.

INSERT INTO destinationTB 
    SELECT sourceTB.id 
    FROM sourceTB 
    LEFT OUTER JOIN destinationTB 
     ON sourceTB.id = destinationTB.id 
    WHERE destinationTB.id IS NULL 
0

Ну, я придумал решение для моего пересмотренного вопроса выше.Этот оператор возвращает только один экземпляр значения, имеющего более одного раза в sourceTB.

INSERT INTO destinationTB (field1) 
SELECT DISTINCT field2 FROM sourceTB 
WHERE EXISTS (SELECT field1 FROM destinationTB) 

Благодарим за помощь и советы по написанию вопросов здесь.

Вот моя ссылка для ответа: http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html