سؤال

لدي جدول مع عمود أريد استخراجه ووضعه في جدول منفصل.

على سبيل المثال، دعنا نقول أن لدي جدول اسمه جهات الاتصال. جهات الاتصال لديها عمود اسمه الاسم الذي يخزن سلسلة. الآن أريد سحب الأسماء إلى جدول آخر باسم اسمه وربط عمود اسم جهة الاتصال إلى معرف جدول الاسم.

يمكنني فقط استخدام SQL للقيام بذلك. أي أفكار على أفضل طريقة للذهاب حول هذا؟

اسمحوا لي أن أعرف إذا كان بإمكاني توضيح أي شيء، شكرا!

تحرير] مشكلة واحدة هي أن جهات اتصال مختلفة يمكن ربطها بنفس الاسم. لذلك عندما يكون لها اتصالات مختلفة نفس الاسم، ويتم تصديرها، فلن يكون لجدول الاسم صف واحد فريد واحد فقط لهذا الاسم وسيشير جميع جهات الاتصال إلى هذا الصف. أعتقد أن هذا لن يكون منطقيا إذا كنت أعمل بالفعل على دفتر اتصال، لكنني فقط أستخدمه لتوضيح مشكلتي.

هل كانت مفيدة؟

المحلول

CREATE TABLE Name (NameID int IDENTITY(1, 1), [Name] varchar(50))

INSERT INTO Name ([Name])
SELECT DISTINCT [Name]
FROM Contact

ALTER TABLE Contact
    ADD COLUMN NameID int

UPDATE Contact
SET NameID = [Name].NameID
FROM Contact
INNER JOIN [Name]
    ON Contact.[Name] = [Name].[Name]

ALTER TABLE Contact
    DROP COLUMN [Name]

ثم أضف قيود مفتاح أجنبي، إلخ.

نصائح أخرى

قم بإنشاء جدول جديد مع مفتاح أجنبي يشير إلى جدول جهة الاتصال. ثم أدخل الأسماء والمستشارين من جدول جهة الاتصال إلى هذا الجدول الجديد. بعد ذلك يمكنك إسقاط عمود "الاسم" من جدول جهة الاتصال.

CREATE TABLE Name
(
   ContactId int,
   Name nvarchar(100)
);

INSERT Name(Name)
SELECT ContactId, Name From Contact;

ALTER TABLE Contact
DROP Column name;

تعديل: نظرا لأنك قد قمت بتحرير السؤال الذي يمكن ذكره أنه يمكن ربط اسم واحد باتصالات متعددة، فإن هذا يغير الأشياء بالطريقة المعاكسة.

CREATE TABLE Name
(
   NameId int IDENTITY,
   Name nvarchar(100)
);

INSERT Name(Name)
SELECT DISTINCT Name From Contact;

ALTER TABLE Contact
ADD NameId int;

UPDATE c
SET c.NameId = n.NameId
FROM Contact c
JOIN Name n on n.Name = c.Name;

ALTER Table Contact
Drop Column Name;

ملاحظة: تأكد من إنشاء المفتاح الأجنبي في الظهور بين الجداول التصلب والاسم باستخدام NameID على جدول جهة الاتصال وإنشاء قيد فريد على عمود "الاسم" في جدول الاسم.

insert into another_table( contact_id, name )
select id, name 
from contacts;

insert into new_table (contact_id, name) select min(id), name from contacts group by name;

هذه طريقة واحدة لضمان وجود صف واحد فقط لكل اسم - يمكنك استبدال الوظائف الأخرى لمدة دقيقة (مثل، على سبيل المثال Max).

لست متأكدا جدا عن سبب رغبتك في القيام بذلك. بغض النظر عن ما، فسوف ينتهي بك الأمر مع بعض جهات الاتصال التي لا تملك اسم مرتبط بها ...

ALTER TABLE `Contacts` ADD `name_id` INT( 12 ) NOT NULL 
ALTER TABLE `Name` ADD `Name` VARCHAR( 200 ) NOT NULL 
INSERT INTO Name (id, name) SELECT id, Name FROM Contacts
ALTER TABLE `Contacts` DROP `Name`

المشكلة هي حقل Name_ID، الذي يملأ مع "0" ويجب أن يكون له نفس القيمة مثل المعرف في جدول جهات الاتصال. هنا يمكنك استخدام حلقه أو تكرار البيان (إذا كنت تستخدم MySQL).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top