เข้าร่วมสองตารางและส่งกลับเพียงแถวเดียวจากตารางที่สอง

ฉันมีสองโต๊ะ ทั้งสองตารางมี ID ที่สามารถใช้เพื่อรวมเข้าด้วยกันได้ อย่างไรก็ตาม ตารางที่ 2 สามารถมี more than one row for the same ID ได้ ตารางที่ 1 จะมีหนึ่งแถวเสมอ

ตัวอย่างเช่น table 1 มี 60,000 แถว เมื่อฉันเข้าร่วมภายในด้านซ้ายด้วย table2 มันจะคืนค่า ~171,000 แถว

สิ่งที่ฉันพยายามทำให้สำเร็จคือส่งคืนแถวแรกจากตารางที่ 2 ดังนั้นเมื่อฉันเข้าร่วม ฉันจะไม่สร้างบันทึกที่ซ้ำกัน

ฉันไม่แน่ใจว่านี่เป็นแนวทางที่ถูกต้องหรือไม่ แต่นี่คือสิ่งที่ฉันลอง:

SELECT I.*, a.Name from table 1 I 
INNER JOIN (SELECT MIN (a.ID), a.NAME FROM table 2 group by a.ID) as a 
on I.ID = a.ID

ฉันได้รับข้อผิดพลาดต่อไปนี้:

ไวยากรณ์ไม่ถูกต้องใกล้ 'i'

ข้อเสนอแนะใด ๆ เกี่ยวกับวิธีที่ฉันสามารถแก้ไขปัญหานี้? หรือได้รับผลลัพธ์ในลักษณะอื่น?


person smr5    schedule 15.10.2014    source แหล่งที่มา
comment
ตารางที่ 1 นี้มีพื้นที่นี้ไหม? ระหว่าง 'ตาราง' และ '1' ในข้อความค้นหาของคุณ? ใส่ 1 ไว้กับตารางหรือลบออกเพื่อลบข้อผิดพลาดที่คุณอธิบาย ..   -  person Deiwys    schedule 16.10.2014
comment
ดูเหมือนว่าคุณต้องการนามแฝงสำหรับ MIN(a.ID) ในตารางที่ได้รับของคุณ ในทางเทคนิคแล้วไม่มีคอลัมน์ ID ในชุดผลลัพธ์นั้น   -  person Dave Johnson    schedule 16.10.2014
comment
นอกจากนี้ฉันไม่เห็นตัวพิมพ์เล็ก i ในโค้ดนั้นเลย   -  person Aaron Bertrand    schedule 16.10.2014


คำตอบ (1)


สิ่งนี้จะรับประกันหนึ่งแถวต่อ id จากตารางที่สองของคุณ

;WITH singleRows AS (
SELECT
    *
    , ROW_NUMBER() OVER (PARTITION BY id ORDER BY name) as rownum
FROM
    table_2)

SELECT
    *
FROM
    table_1 t1

    JOIN singleRows t2
        ON t1.id = t2.id
        AND t2.rownum = 1
person Ryan B.    schedule 15.10.2014
comment
ขอบคุณ! นั่นคือสิ่งที่ฉันกำลังมองหา - person smr5; 16.10.2014
comment
สิ่งนี้เกือบจะได้ผล แต่ด้วยเหตุผลบางอย่าง หาก table_2 มี 50 รายการสำหรับหนึ่งรายการใน table_1 แบบสอบถามแสดงรายการ 50 รายการที่มีข้อมูลเดียวกัน - person Si8; 13.11.2020