SQL Server แทรกหากไม่มีแนวปฏิบัติที่เหมาะสมที่สุด


152

ฉันมีCompetitionsตารางผลลัพธ์ที่เก็บชื่อสมาชิกในทีมและอันดับของพวกเขาไว้ในมือเดียว

ในอีกทางหนึ่งฉันต้องรักษาตารางชื่อคู่แข่งที่ไม่ซ้ำกัน :

CREATE TABLE Competitors (cName nvarchar(64) primary key)

ตอนนี้ฉันมีผลลัพธ์ 200,000 รายการในตารางที่ 1 และเมื่อตารางคู่แข่งว่างเปล่าฉันสามารถทำสิ่งนี้ได้:

INSERT INTO Competitors SELECT DISTINCT Name FROM CompResults

และแบบสอบถามใช้เวลาเพียง 5 วินาทีในการแทรกชื่อประมาณ 11,000 ชื่อ

จนถึงตอนนี้นี่ไม่ใช่แอปพลิเคชันที่สำคัญดังนั้นฉันจึงสามารถตัดทอนตารางคู่แข่งได้เดือนละครั้งเมื่อฉันได้รับผลการแข่งขันใหม่ที่มี 10,000 แถว

แต่วิธีปฏิบัติที่ดีที่สุดคืออะไรเมื่อมีการเพิ่มผลลัพธ์ใหม่กับคู่แข่งรายใหม่และรายเดิม? ฉันไม่ต้องการตัดทอนตารางคู่แข่งที่มีอยู่

ฉันจำเป็นต้องดำเนินการคำสั่ง INSERT สำหรับคู่แข่งรายใหม่เท่านั้นและไม่ต้องทำอะไรหากมีอยู่


70
กรุณาอย่าสร้างNVARCHAR(64)คอลัมน์หลักของคุณ (และ: การจัดกลุ่ม) ที่สำคัญ !! ก่อนอื่น - เป็นปุ่มที่กว้างมาก- สูงสุด 128 ไบต์; และอย่างที่สองคือขนาดตัวแปร - อีกครั้ง: ไม่ดีที่สุด ... นี่เป็นตัวเลือกที่แย่ที่สุดที่คุณมี - การแสดงของคุณจะเป็นนรกและการกระจายตัวของตารางและดัชนีจะอยู่ที่ 99.9% ตลอดเวลา .....
marc_s

4
มาร์คมีจุดดี อย่าใช้ชื่อเป็น pk ของคุณ ใช้รหัสโดยเฉพาะอย่างยิ่ง int หรือสิ่งที่มีน้ำหนักเบา
ริชา

6
ดูโพสต์บล็อกของ Kimberly Trippเกี่ยวกับสิ่งที่ทำให้คีย์การจัดกลุ่มดี : ไม่ซ้ำกันแคบคงที่และเพิ่มมากขึ้นเรื่อย ๆ ความcNameล้มเหลวของคุณในสามในสี่ประเภท .... (ไม่แคบมันอาจจะไม่คงที่และไม่เพิ่มมากขึ้นอย่างแน่นอน)
marc_s

ฉันไม่เห็นจุดในการเพิ่มคีย์หลัก INT ลงในตารางชื่อคู่แข่งซึ่งคำค้นหาทั้งหมดจะอยู่ในชื่อเช่น 'WHERE ชื่อเช่น'% xxxxx% '' ดังนั้นฉันต้องการดัชนีที่ไม่ซ้ำกับชื่อเสมอ แต่ใช่ฉันเห็นจุดที่ไม่ทำให้ความยาวแปรผัน ..
Didier Levy

3
ก) การหลีกเลี่ยงการกระจายตัวและ b) ถ้ามันเป็นกุญแจสำคัญต่างประเทศในตารางอื่น ๆ ข้อมูลที่ซ้ำกันมีขนาดใหญ่กว่าความจำเป็น (ซึ่งก็คือการพิจารณาความเร็ว)
JamesRyan

คำตอบ:


214

ความหมายที่คุณถาม "แทรกคู่แข่งที่ไม่มีอยู่":

INSERT Competitors (cName)
SELECT DISTINCT Name
FROM CompResults cr
WHERE
   NOT EXISTS (SELECT * FROM Competitors c
              WHERE cr.Name = c.cName)

2
นี่คือสิ่งที่ฉันจะทำก่อนที่จะวางคำถามเกี่ยวกับดังนั้น แต่ความคิดหลักของฉันคือ: สิ่งนี้จะดำเนินการได้ดีกับการสร้างตารางชื่อตั้งแต่เริ่มต้นสัปดาห์ละครั้งหรือประมาณนั้น? (โปรดจำไว้ว่าจะใช้เวลาเพียงไม่กี่วินาที)
Didier Levy

3
@Didier Levy: ประสิทธิภาพหรือไม่ เหตุใดจึงตัดทอนสร้างใหม่เมื่อคุณสามารถอัปเดตด้วยความแตกต่างเท่านั้น นั่นคือ: BEGIN TRAN ลบ CompResults INSERT CompResults .. COMMIT TRAN = ทำงานได้มากกว่า
GBN

@gbn - มีวิธีใช้ตรรกะ if-else อย่างปลอดภัยที่นี่แทนคำตอบของคุณหรือไม่? ฉันมีคำถามที่เกี่ยวข้อง คุณช่วยฉันได้ไหม stackoverflow.com/questions/21889843/…
Steam

53

ตัวเลือกอื่นคือให้เข้าร่วมตารางผลลัพธ์ของคุณกับตารางคู่แข่งที่มีอยู่ของคุณและค้นหาคู่แข่งใหม่ด้วยการกรองระเบียนที่แตกต่างกันซึ่งไม่ตรงกับการเข้าร่วม:

INSERT Competitors (cName)
SELECT  DISTINCT cr.Name
FROM    CompResults cr left join
        Competitors c on cr.Name = c.cName
where   c.cName is null

ไวยากรณ์ใหม่ของMERGEยังนำเสนอวิธีการที่กะทัดรัดสวยงามและมีประสิทธิภาพในการทำเช่นนั้น:

MERGE INTO Competitors AS Target
USING (SELECT DISTINCT Name FROM CompResults) AS Source ON Target.Name = Source.Name
WHEN NOT MATCHED THEN
    INSERT (Name) VALUES (Source.Name);

1
การรวมที่ยอดเยี่ยมในกรณีนี้มันทำสิ่งที่ระบุไว้
VorobeY1326

ฉันเชื่อว่านี่เป็นวิธีที่เหมาะสมที่จะไปให้ SQL Server คำแนะนำที่เป็นไปได้ที่ดีที่สุดสำหรับการเพิ่มประสิทธิภาพในทางตรงกันข้ามกับวิธีการค้นหาย่อย
Mads Nielsen

4
คำสั่ง MERGE ยังคงมีปัญหามากมาย เพียงแค่ google "ปัญหาการรวม SQL" - บล็อกเกอร์จำนวนมากได้กล่าวถึงเรื่องนี้ในระยะเวลา
David Wilson

เหตุใดจึงมีเป้าหมายเป็นคำสั่ง MERGE แต่ไม่มีเป้าหมายในคำสั่ง INSERT มีความแตกต่างมากขึ้นที่ทำให้ยากที่จะเข้าใจความเท่าเทียมกัน
ปีเตอร์

32

ยังไม่รู้ว่าทำไมคนอื่นถึงไม่พูดเรื่องนี้

ทำให้ปกติ

คุณมีตารางที่เป็นแบบจำลองการแข่งขันหรือไม่? การแข่งขันถูกสร้างขึ้นจากคู่แข่ง? คุณต้องการรายชื่อผู้เข้าแข่งขันที่แตกต่างกันในการแข่งขันอย่างน้อยหนึ่งรายการ ......

คุณควรมีตารางต่อไปนี้ .....

CREATE TABLE Competitor (
    [CompetitorID] INT IDENTITY(1,1) PRIMARY KEY
    , [CompetitorName] NVARCHAR(255)
    )

CREATE TABLE Competition (
    [CompetitionID] INT IDENTITY(1,1) PRIMARY KEY
    , [CompetitionName] NVARCHAR(255)
    )

CREATE TABLE CompetitionCompetitors (
    [CompetitionID] INT
    , [CompetitorID] INT
    , [Score] INT

    , PRIMARY KEY (
        [CompetitionID]
        , [CompetitorID]
        )
    )

ด้วยข้อ จำกัด ด้านการแข่งขันนักแข่งการแข่งขันและผู้แข่งขันที่ชี้ไปที่ตารางอื่น

ด้วยโครงสร้างของตารางแบบนี้ - กุญแจของคุณเป็น INTS ที่เรียบง่าย - ดูเหมือนว่าจะไม่มีคีย์ NATURAL ที่ดีที่เหมาะกับแบบจำลองดังนั้นฉันคิดว่าคีย์ SURROGATE นั้นเหมาะสมดี

ดังนั้นหากคุณมีสิ่งนี้อยู่แล้วเพื่อให้ได้รายชื่อของคู่แข่งที่แตกต่างกันในการแข่งขันเฉพาะคุณสามารถออกแบบสอบถามเช่นนี้

DECLARE @CompetitionName VARCHAR(50) SET @CompetitionName = 'London Marathon'

    SELECT
        p.[CompetitorName] AS [CompetitorName]
    FROM
        Competitor AS p
    WHERE
        EXISTS (
            SELECT 1
            FROM
                CompetitionCompetitor AS cc
                JOIN Competition AS c ON c.[ID] = cc.[CompetitionID]
            WHERE
                cc.[CompetitorID] = p.[CompetitorID]
                AND cc.[CompetitionName] = @CompetitionNAme
        )

และถ้าคุณต้องการให้คะแนนสำหรับการแข่งขันแต่ละครั้งคู่แข่งอยู่ใน:

SELECT
    p.[CompetitorName]
    , c.[CompetitionName]
    , cc.[Score]
FROM
    Competitor AS p
    JOIN CompetitionCompetitor AS cc ON cc.[CompetitorID] = p.[CompetitorID]
    JOIN Competition AS c ON c.[ID] = cc.[CompetitionID]

และเมื่อคุณมีการแข่งขันใหม่กับคู่แข่งรายใหม่คุณเพียงแค่ตรวจสอบว่ามีใครอยู่ในตารางคู่แข่ง หากมีอยู่แล้วคุณจะไม่แทรกเข้าไปในคู่แข่งสำหรับคู่แข่งเหล่านั้นและทำการแทรกสำหรับคู่แข่งใหม่

จากนั้นคุณแทรกการแข่งขันใหม่ในการแข่งขันและในที่สุดคุณเพียงแค่สร้างลิงก์ทั้งหมดในคู่แข่งของการแข่งขัน


2
สมมติว่า OP มีความโน้มเอียงในเวลานี้เพื่อปรับโครงสร้างตารางทั้งหมดของเขาเพื่อให้ได้ผลลัพธ์หนึ่งแคช เขียนซ้ำ db และแอปของคุณแทนที่จะแก้ปัญหาภายในขอบเขตที่กำหนดบางครั้งทุกสิ่งที่ไม่ตกอยู่ในสถานที่ได้อย่างง่ายดายเป็นสูตรสำหรับภัยพิบัติ
Jeffrey Vest

1
บางทีในกรณีของ OP เช่นของฉันคุณไม่สามารถแก้ไขฐานข้อมูลได้ตลอดเวลาและการเขียนใหม่ / การทำให้ปกติฐานข้อมูลเก่าไม่ได้อยู่ในงบประมาณหรือเวลาที่กำหนดเสมอไป
eaglei22

10

Competitorsคุณจะต้องเข้าร่วมโต๊ะด้วยกันและได้รับรายชื่อของคู่แข่งที่ไม่ซ้ำกันที่ไม่ได้มีอยู่แล้วใน

สิ่งนี้จะแทรกบันทึกที่ไม่ซ้ำกัน

INSERT Competitors (cName) 
SELECT DISTINCT Name
FROM CompResults cr LEFT JOIN Competitors c ON cr.Name = c.cName
WHERE c.Name IS NULL

อาจมีเวลาที่การแทรกจะต้องทำอย่างรวดเร็วโดยไม่สามารถรอการเลือกชื่อเฉพาะได้ ในกรณีนั้นคุณสามารถแทรกชื่อที่ไม่ซ้ำกันลงในตารางชั่วคราวจากนั้นใช้ตารางชั่วคราวนั้นเพื่อแทรกลงในตารางจริงของคุณ วิธีนี้ใช้ได้ดีเนื่องจากการประมวลผลทั้งหมดเกิดขึ้นในเวลาที่คุณแทรกเข้าไปในตารางชั่วคราวดังนั้นจึงไม่มีผลต่อตารางจริงของคุณ จากนั้นเมื่อคุณทำการประมวลผลทั้งหมดเสร็จแล้วคุณทำการแทรกอย่างรวดเร็วในตารางจริง ฉันอาจพันส่วนสุดท้ายที่คุณแทรกลงในตารางจริงภายในธุรกรรม


4

คำตอบข้างต้นที่พูดคุยเกี่ยวกับการทำให้ปกตินั้นยอดเยี่ยมมาก! แต่ถ้าคุณพบว่าตัวเองอยู่ในตำแหน่งอย่างฉันที่คุณไม่ได้รับอนุญาตให้แตะสคีมาฐานข้อมูลหรือโครงสร้างตามที่ตั้งไว้ล่ะ เช่น DBA นั้นเป็น 'เทพเจ้า' และการแก้ไขที่แนะนำทั้งหมดไปที่ / dev / null?

ในแง่นั้นฉันรู้สึกเหมือนว่าได้รับคำตอบด้วยการโพสต์สแต็คโอเวอร์โฟลว์นี้ด้วยเช่นกันเกี่ยวกับผู้ใช้ทั้งหมดที่ให้โค้ดตัวอย่าง

ฉันโพสต์รหัสจากINSERT VALUES ที่ไม่มีอยู่ซึ่งช่วยฉันได้มากที่สุดเนื่องจากฉันไม่สามารถเปลี่ยนตารางฐานข้อมูลพื้นฐานได้:

INSERT INTO #table1 (Id, guidd, TimeAdded, ExtraData)
SELECT Id, guidd, TimeAdded, ExtraData
FROM #table2
WHERE NOT EXISTS (Select Id, guidd From #table1 WHERE #table1.id = #table2.id)
-----------------------------------
MERGE #table1 as [Target]
USING  (select Id, guidd, TimeAdded, ExtraData from #table2) as [Source]
(id, guidd, TimeAdded, ExtraData)
    on [Target].id =[Source].id
WHEN NOT MATCHED THEN
    INSERT (id, guidd, TimeAdded, ExtraData)
    VALUES ([Source].id, [Source].guidd, [Source].TimeAdded, [Source].ExtraData);
------------------------------
INSERT INTO #table1 (id, guidd, TimeAdded, ExtraData)
SELECT id, guidd, TimeAdded, ExtraData from #table2
EXCEPT
SELECT id, guidd, TimeAdded, ExtraData from #table1
------------------------------
INSERT INTO #table1 (id, guidd, TimeAdded, ExtraData)
SELECT #table2.id, #table2.guidd, #table2.TimeAdded, #table2.ExtraData
FROM #table2
LEFT JOIN #table1 on #table1.id = #table2.id
WHERE #table1.id is null

โค้ดด้านบนใช้ฟิลด์ที่แตกต่างจากสิ่งที่คุณมี แต่คุณจะได้รับส่วนสำคัญทั่วไปด้วยเทคนิคต่างๆ

โปรดทราบว่าตามคำตอบที่เป็นต้นฉบับในกองมากเกินรหัสนี้ที่คัดลอกมาจากที่นี่

อย่างไรก็ตามประเด็นของฉันคือ "แนวปฏิบัติที่ดีที่สุด" มักจะเกิดขึ้นกับสิ่งที่คุณสามารถทำได้และไม่สามารถทำได้เช่นเดียวกับทฤษฎี

  • หากคุณสามารถทำให้ปกติและสร้างดัชนี / คีย์ - ยอดเยี่ยม!
  • ถ้าไม่ใช่และคุณมีรีสอร์ตในการแฮ็กรหัสเช่นฉันหวังว่าจะช่วยได้

โชคดี!


ในกรณีที่ยังไม่ชัดเจนนี่เป็นวิธีที่แตกต่างกันสี่วิธีในการแก้ปัญหาดังนั้นเลือกหนึ่งวิธี
nasch

3

การทำให้มาตรฐานตารางการทำงานของคุณเป็นปกติตามที่แนะนำโดย Transact Charlie เป็นความคิดที่ดีและจะช่วยประหยัดอาการปวดหัวและปัญหาต่าง ๆ ในช่วงเวลา - แต่มีสิ่งต่าง ๆ เช่นตารางอินเทอร์เฟซที่รองรับการรวมเข้ากับระบบภายนอกและการรายงานตารางการประมวลผล; และประเภทที่ของตารางควรไม่จำเป็นต้องปกติ - ในความเป็นจริงมากมักจะเป็นมากสะดวกสบายมากขึ้นและ performant สำหรับพวกเขาจะไม่เป็น

ในกรณีนี้ฉันคิดว่าข้อเสนอของ Transact Charlie สำหรับตารางปฏิบัติการของคุณนั้นดี

แต่ฉันจะเพิ่มดัชนี (ไม่จำเป็นต้องไม่ซ้ำกัน) ไปยัง CompetitorName ในตารางคู่แข่งเพื่อสนับสนุนการรวมที่มีประสิทธิภาพบน CompetitorName เพื่อวัตถุประสงค์ในการรวม (โหลดข้อมูลจากแหล่งภายนอก) และฉันจะใส่ตารางอินเทอร์เฟซลงใน Mix: CompetitionResults

CompetitionResults ควรมีข้อมูลใด ๆ ที่ผลการแข่งขันของคุณมีอยู่ จุดของตารางอินเทอร์เฟซเช่นนี้คือทำให้มันง่ายและรวดเร็วที่สุดในการตัดและโหลดใหม่จากแผ่นงาน Excel หรือไฟล์ CSV หรือรูปแบบใดก็ตามที่คุณมีข้อมูลนั้น

ไม่ควรถือว่าตารางส่วนต่อประสานนั้นเป็นส่วนหนึ่งของชุดปฏิบัติการตารางปกติจากนั้นคุณสามารถเข้าร่วมกับ RaceResults ตามที่ Richard แนะนำเพื่อแทรกระเบียนลงในคู่แข่งที่ไม่มีอยู่แล้วและอัปเดตสิ่งที่ทำ (เช่นถ้าคุณมีข้อมูลเพิ่มเติมเกี่ยวกับคู่แข่งเช่นหมายเลขโทรศัพท์หรือที่อยู่อีเมล)

สิ่งหนึ่งที่ฉันจะทราบ - ในความเป็นจริงชื่อคู่แข่งดูเหมือนว่าสำหรับฉันคือ อย่างมากไม่น่าจะไม่ซ้ำกันในข้อมูลของคุณ ในคู่แข่ง 200,000 คนคุณอาจมี David Smith 2 คนขึ้นไป ดังนั้นฉันขอแนะนำให้คุณรวบรวมข้อมูลเพิ่มเติมจากคู่แข่งเช่นหมายเลขโทรศัพท์หรือที่อยู่อีเมลหรือบางสิ่งที่มีแนวโน้มว่าจะไม่ซ้ำกัน

ตารางการปฏิบัติงานของคุณคู่แข่งควรมีหนึ่งคอลัมน์สำหรับแต่ละรายการข้อมูลที่มีส่วนช่วยในการรวมคีย์ธรรมชาติ เช่นควรมีหนึ่งคอลัมน์สำหรับที่อยู่อีเมลหลัก แต่ตารางส่วนต่อประสานควรมีช่องสำหรับเก่าและใหม่สำหรับที่อยู่อีเมลหลักเพื่อให้สามารถใช้ค่าเก่าเพื่อค้นหาบันทึกในคู่แข่งและอัปเดตส่วนนั้นให้เป็นค่าใหม่

ดังนั้นการแข่งขันผลการแข่งขันควรมีบางฟิลด์ "เก่า" และ "ใหม่" - oldEmail, newEmail, oldPhone, newPhone ฯลฯ วิธีที่คุณสามารถสร้างคีย์ผสมในคู่แข่งจากคู่แข่งชื่ออีเมลและโทรศัพท์

จากนั้นเมื่อคุณมีผลลัพธ์การแข่งขันคุณสามารถตัดทอนและโหลดตาราง CompetitionResults ของคุณใหม่จากแผ่นงาน excel หรืออะไรก็ตามที่คุณมีและเรียกใช้การแทรกที่มีประสิทธิภาพเพียงครั้งเดียวเพื่อแทรกคู่แข่งใหม่ทั้งหมดลงในตารางคู่แข่งและการอัปเดตที่มีประสิทธิภาพ ข้อมูลทั้งหมดเกี่ยวกับคู่แข่งที่มีอยู่จากการแข่งขัน และคุณสามารถแทรกเดี่ยวเพื่อแทรกแถวใหม่ลงในตาราง CompetitionCompetitors สิ่งเหล่านี้สามารถทำได้ในกระบวนงานที่เก็บไว้ ProcessCompetitionResults ซึ่งสามารถดำเนินการได้หลังจากโหลดตาราง CompetitionResults

นั่นเป็นคำอธิบายพื้นฐานของสิ่งที่ฉันได้เห็นในโลกแห่งความเป็นจริงที่มี Oracle Applications, SAP, PeopleSoft และรายการซักอบรีดของชุดซอฟต์แวร์องค์กรอื่น ๆ

หนึ่งความคิดเห็นล่าสุดที่ฉันทำคือสิ่งที่ฉันเคยทำมาก่อนหน้านี้ใน SO: หากคุณสร้างคีย์ต่างประเทศที่รับประกันว่าคู่แข่งมีอยู่ในตารางคู่แข่งก่อนที่คุณจะสามารถเพิ่มแถวกับคู่แข่งนั้นในการแข่งขันคู่แข่งตรวจสอบให้แน่ใจว่า foreign key ถูกตั้งค่าเป็นเรียงซ้อนการปรับปรุงและลบต่างประเทศที่สำคัญมีการตั้งค่าการปรับปรุงน้ำตกและลบ ด้วยวิธีนี้หากคุณต้องการลบคู่แข่งคุณสามารถทำได้และแถวทั้งหมดที่เกี่ยวข้องกับคู่แข่งนั้นจะถูกลบโดยอัตโนมัติ มิฉะนั้นโดยค่าเริ่มต้นรหัสต่างประเทศจะกำหนดให้คุณลบแถวที่เกี่ยวข้องทั้งหมดออกจากตัวแข่งขันของคู่แข่งก่อนที่จะให้คุณลบคู่แข่ง

(บางคนคิดว่ากุญแจต่างประเทศที่ไม่ได้เรียงกันเป็นข้อควรระวังเพื่อความปลอดภัยที่ดี แต่ประสบการณ์ของฉันคือพวกเขาเป็นเพียงความเจ็บปวดที่ซุกซนในก้นที่บ่อยกว่าไม่ใช่เพียงแค่การกำกับดูแลและพวกเขาสร้างงานจำนวนมาก สำหรับ DBA การจัดการกับผู้คนโดยไม่ตั้งใจลบสิ่งต่าง ๆ คือสาเหตุที่คุณมีสิ่งต่าง ๆ เช่นกล่องโต้ตอบ "คุณแน่ใจ" และการสำรองข้อมูลปกติหลายประเภทและแหล่งข้อมูลซ้ำซ้อนมันไกลกันมากที่ต้องการลบคู่แข่งที่มีข้อมูลทั้งหมด ตัวอย่างเช่นสับสนมากกว่าที่จะลบโดยไม่ตั้งใจแล้วไปที่ "โอ้ไม่! ฉันไม่ได้ตั้งใจทำอย่างนั้นและตอนนี้ฉันไม่มีผลการแข่งขันของพวกเขา! Aaaahh!" อย่างหลังนี้เป็นเรื่องธรรมดาพอดังนั้น คุณจำเป็นต้องเตรียมพร้อมสำหรับมัน แต่อดีตนั้นเป็นเรื่องธรรมดามากดังนั้นวิธีที่ง่ายที่สุดและดีที่สุดในการเตรียมตัวสำหรับอดีตคือ imo คือการทำคีย์ต่างประเทศเรียงซ้อนการอัปเดตและลบ)


1

ตกลงนี่ถูกถามเมื่อ 7 ปีที่แล้ว แต่ฉันคิดว่าทางออกที่ดีที่สุดที่นี่คือนำหน้าตารางใหม่ทั้งหมดและทำสิ่งนี้เป็นมุมมองที่กำหนดเอง ด้วยวิธีนี้คุณไม่ได้ทำซ้ำข้อมูลไม่ต้องกังวลกับข้อมูลที่ไม่ซ้ำใครและไม่ได้สัมผัสกับโครงสร้างฐานข้อมูลจริง บางสิ่งเช่นนี้

CREATE VIEW vw_competitions
  AS
  SELECT
   Id int
   CompetitionName nvarchar(75)
   CompetitionType nvarchar(50)
   OtherField1 int
   OtherField2 nvarchar(64)  --add the fields you want viewed from the Competition table
  FROM Competitions
GO

สามารถเพิ่มรายการอื่น ๆ ได้ที่นี่เช่นเข้าร่วมในตารางอื่น ๆ WHERE clauses ฯลฯ นี่เป็นวิธีที่ดีที่สุดในการแก้ปัญหานี้เนื่องจากคุณสามารถสอบถามมุมมองได้:

SELECT *
FROM vw_competitions

... และเพิ่มส่วนคำสั่ง WHERE, IN หรือ EXISTS ให้กับคิวรีมุมมอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.