এসকিউএল সার্ভারে অন্তর্ভুক্ত নির্বাচন কোয়েরিতে সদৃশগুলি এড়িয়ে চলুন


109

আমার কাছে নিম্নলিখিত দুটি টেবিল রয়েছে:

Table1
----------
ID   Name
1    A
2    B
3    C

Table2
----------
ID   Name
1    Z

আমি থেকে তথ্য সন্নিবেশ করতে প্রয়োজন Table1থেকে Table2। আমি নিম্নলিখিত বাক্য গঠন ব্যবহার করতে পারি:

INSERT INTO Table2(Id, Name) SELECT Id, Name FROM Table1

তবে, আমার ক্ষেত্রে, সদৃশ আইডি উপস্থিত থাকতে পারে Table2(আমার ক্ষেত্রে এটি কেবল " 1") এবং আমি এটিকে আবার অনুলিপি করতে চাই না কারণ এটি একটি ত্রুটি ছুঁড়ে দেয়।

আমি এরকম কিছু লিখতে পারি:

IF NOT EXISTS(SELECT 1 FROM Table2 WHERE Id=1)
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1 
ELSE
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1 WHERE Table1.Id<>1

এটি ব্যবহার না করে কি আরও ভাল উপায় আছে IF - ELSE? আমি INSERT INTO-SELECTকিছু শর্তের ভিত্তিতে দুটি বিবৃতি এড়াতে চাই ।

উত্তর:


201

ব্যবহার NOT EXISTS:

INSERT INTO TABLE_2
  (id, name)
SELECT t1.id,
       t1.name
  FROM TABLE_1 t1
 WHERE NOT EXISTS(SELECT id
                    FROM TABLE_2 t2
                   WHERE t2.id = t1.id)

ব্যবহার NOT IN:

INSERT INTO TABLE_2
  (id, name)
SELECT t1.id,
       t1.name
  FROM TABLE_1 t1
 WHERE t1.id NOT IN (SELECT id
                       FROM TABLE_2)

ব্যবহার LEFT JOIN/IS NULL:

INSERT INTO TABLE_2
  (id, name)
   SELECT t1.id,
          t1.name
     FROM TABLE_1 t1
LEFT JOIN TABLE_2 t2 ON t2.id = t1.id
    WHERE t2.id IS NULL

তিনটি বিকল্পের মধ্যে, LEFT JOIN/IS NULLকম দক্ষ। আরও তথ্যের জন্য এই লিঙ্কটি দেখুন ।


9
নন অস্টিস্টস সংস্করণে কেবল একটি ব্যাখ্যা, আপনার একটি উইথ (হোল্ডলক) প্রয়োজন হবে বা কোনও লক নেওয়া হবে না (কারণ লক করার জন্য কোনও সারি নেই!) যাতে অন্য থ্রেডটি আপনার নীচে সারিটি sertোকাতে পারে।
অদৃশ্য

3
আকর্ষণীয়, কারণ আমি সর্বদা সাব-সিলেক্টের চেয়ে দ্রুত হওয়াতে যোগদানকে বিশ্বাস করি। সম্ভবত এটি কেবল সরল যোগদানের জন্য, এবং বাম যোগদানগুলিতে প্রযোজ্য নয়।
ডানকান

1
ডানকান, যোগ দেওয়া প্রায়শই দ্রুত হয় যা সাবকোরিয়াসের সাথে সম্পর্কিত হলে তা সাবলেট হয়। আপনার যদি নির্বাচিত তালিকায় সাবকিউরিটি থাকে তবে একটি যোগদান প্রায়শই দ্রুত হবে।
এইচএলজিইএম

9
NOT EXISTSবিশেষত যৌগিক প্রাথমিক কী সহ কার্যকর, NOT INতবে কাজ করবে না
38

1
@ ওএমজিপিওনিগুলি - আরও তথ্যের জন্য আপনার লিঙ্কটি মারা গেছে বলে মনে হচ্ছে। আপনার কাছে অন্যটি রয়েছে যা কার্যকর হতে পারে?
ফ্রিমন

36

মাইএসকিউএল এ আপনি এটি করতে পারেন:

INSERT IGNORE INTO Table2(Id, Name) SELECT Id, Name FROM Table1

এসকিউএল সার্ভারের কি তেমন কিছু রয়েছে?


5
আমাকে এ সম্পর্কে শিক্ষার জন্য +1 করুন। খুব সুন্দর বাক্য গঠন। আমি যেটি ব্যবহার করেছি তার চেয়ে অবশ্যই খাটো এবং ভাল and দুর্ভাগ্যক্রমে SQL সার্ভারে এটি নেই।
আশীষ গুপ্ত

13
সম্পূর্ণ সত্য নয়। আপনি যখন একটি অনন্য সূচক তৈরি করেন, আপনি এটিকে "অনুলিপিগুলি উপেক্ষা" করতে সেট করতে পারেন, সেক্ষেত্রে এসকিউএল সার্ভার নকল যোগ করার কোনও প্রচেষ্টা উপেক্ষা করবে।
IamIC

2
এবং এসকিউএল সার্ভার এখনও ... করুণাময় করতে পারে না।
স্ম্যাক জ্যাক

1
সুতরাং এসকিউএল সার্ভার এখনও ক্যান্ট?
ইংগাস

8

আমার ঠিক একইরকম সমস্যা হয়েছিল, DISTINCT কীওয়ার্ডটি যাদু কাজ করে:

INSERT INTO Table2(Id, Name) SELECT DISTINCT Id, Name FROM Table1

21
যদি না আমি সম্পূর্ণই ভুল বুঝা আপনি এই যদি আপনি সেট আপনি ঢোকাতে করছি মধ্যে সদৃশ আছে কাজ করবে থেকে । এটি আপনাকে সাহায্য করবে না যদি আপনি যে সেটটি সন্নিবেশ করিয়েছেন সেটি insert intoটেবিলে থাকা ডেটারের নকল হতে পারে ।
ফ্রিম্যান

5

আমি সম্প্রতি একই সমস্যার মুখোমুখি হয়েছি ...
এম এস এসকিউএল সার্ভার 2017 এ আমার জন্য কী কাজ করেছে ... হ'ল
প্রাথমিক কীটি টেবিল 2 এ আইডিতে সেট করা উচিত ...
কলাম এবং কলামের বৈশিষ্ট্য উভয়ের মধ্যে অবশ্যই এক হওয়া উচিত টেবিল। আপনি নীচের স্ক্রিপ্টটি চালানোর সময় এটি প্রথম কাজ করবে। সারণি 1 এ সদৃশ আইডি, sertোকানো হবে না ...

আপনি যদি দ্বিতীয়বার এটি চালান, আপনি একটি পাবেন

প্রাথমিক কেই বাধা ত্রুটি লঙ্ঘন

এই কোড:

Insert into Table_2
Select distinct *
from Table_1
where table_1.ID >1

4

আইএনসি দ্বারা প্রস্তাবিতignore Duplicates অনন্য সূচকটি ব্যবহার করা এখানে একই ধরণের সমস্যার জন্য আমার সমাধান ছিল, অপশনটি দিয়ে সূচক তৈরি করাWITH IGNORE_DUP_KEY

In backward compatible syntax
, WITH IGNORE_DUP_KEY is equivalent to WITH IGNORE_DUP_KEY = ON.

রেফারেন্স: সূচি_প্রাপ্তি


4

এসকিউএল সার্ভার থেকে আপনি টেবিলে একটি অনন্য কী সূচক সেট করতে পারেন (কলামগুলি যে অনন্য হওয়া প্রয়োজন)

এসকিএল সার্ভার থেকে টেবিল ডিজাইনে ডান ক্লিক করুন সূচক / কী নির্বাচন করুন

কলাম (গুলি) নির্বাচন করুন যা সদৃশ হবে না, তারপরে অনন্য কী টাইপ করুন


1

কিছুটা সামান্য বিষয়, তবে আপনি যদি কোনও নতুন টেবিলের উপর ডেটা স্থানান্তর করতে চান এবং সম্ভাব্য নকলগুলি মূল টেবিলটিতে থাকে এবং সম্ভবত কপিটি কোনও আইডি নয়, তবে এটি GROUP BYকরবে:

INSERT INTO TABLE_2
(name)
  SELECT t1.name
  FROM TABLE_1 t1
  GROUP BY t1.name

-1

যথেষ্ট DELETEহওয়ার আগে একটি সহজ INSERT:

DELETE FROM Table2 WHERE Id = (SELECT Id FROM Table1)
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1

কোন টেবিলের উপর নির্ভর করে এবং আপনি সংরক্ষণ করতে চান তার জুটির Table1জন্য স্যুইচিং ।Table2Idname


3
দয়া করে এটি করবেন না। আপনি মূলত বলছেন "আমার কাছে যা কিছু তথ্য ছিল তা নিরর্থক, আসুন কেবল এই নতুন ডেটা sertোকানো যাক!"
Andir

@ আন্ডির যদি কোনও কারণে "টেবিল 2" "INSERT" এর পরে বাদ না পড়ে তবে অন্যান্য পদ্ধতিগুলি ব্যবহার করুন, তবে ওপি যা বলেছিল তা অর্জন করার জন্য এটি একটি সঠিক বৈধ উপায়।
স্যাকরো

1
বৈধ, তবে অবশ্যই লেনদেন ছাড়াই ধীর এবং সম্ভাব্যভাবে দূষিত। আপনি যদি এই রুটে যান তবে কোনও ট্রান্সএকশনে মোড়ক করুন।
এমসি 9000
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.