2011-12-07 33 views
5

Tôi có 2 bảng:sql tham gia mà nói với tôi nếu ID tồn tại trong bảng khác

A  B 
-- ---- 
ID FKID 
-- ---- 
1  3 
2  3 
3  4 
4  4 

Tôi cần một câu lệnh select trong đó cho thấy tôi tất cả của A với một lĩnh vực mà nói với tôi nếu bảng B có bất kỳ id đó khớp với ID đó.

Desired Result 
----------- 
ID | hasB 
----------- 
1 no 
2 no  
3 yes 
4 yes 
+0

sử dụng bên ngoài tham gia và NVL – Randy

+0

gì hương vị của sql? –

+0

Tôi đang sử dụng postgis – capdragon

Trả lời

10

Trong SQL Server này sẽ là cách hiệu quả nhất chứ không phải làm một OUTER JOIN sau đó loại bỏ các bản sao với DISTINCT. Không chắc chắn về bưu điện, bạn cần phải kiểm tra các gói.

SELECT ID, 
     CASE 
     WHEN EXISTS (SELECT * 
         FROM B 
         WHERE B.FKID = A.ID) THEN 'yes' 
     ELSE 'no' 
     END AS hasB 
FROM A 
+3

+1: Đồng ý rằng điều này * có khả năng * để tránh tải không cần thiết trên máy chủ bằng cách tránh nhu cầu GROUP BY, DISTINCT và không cần xử lý tất cả các hàng trùng lặp trong bảngB. – MatBailie

+1

@Dems: Bạn mang lại "giá trị gia tăng" tuyệt vời cho cộng đồng này bằng cách giúp một người đưa ra quyết định. Nhận xét của bạn được đánh giá rất cao. (1) cho cả hai. – capdragon

+0

@capdragon: Tôi cũng có thể là một nỗi đau ở mông, nhưng tôi cảm ơn tất cả các bạn :) – MatBailie

2
SELECT DISTINCT 
    a.ID, 
    CASE WHEN b.FKID IS NULL THEN 'no' ELSE 'yes' END AS hasB 
FROM 
    tableA a LEFT JOIN 
    tableB b ON a.ID = b.FKID 
+1

1: nhiều mối quan hệ sẽ gây ra các bản sao trong đầu ra. (Sử dụng GROUP BY là tốt, hoặc EXISTS thay thế?) – MatBailie

+0

Điểm tốt ... được cập nhật. –

+0

+1 để trở thành người đầu tiên đăng bài. – capdragon

1

Something như thế này nên làm việc ra cho bạn tùy thuộc vào những gì mà nền tảng DB thực sự là. Bạn có thể cần phải trao đổi các trường hợp cho một IIF trên một cái gì đó đáng yêu như MS Access.

select A.ID, case when B.FKID IS NULL then 'no' else 'yes' end as hasB from A left join B on A.ID = B.FKID 
+0

Điều này được ưu tiên vì nó có thể đọc được – Oybek

+3

1: nhiều mối quan hệ sẽ gây ra các bản sao trong đầu ra. (Sử dụng GROUP BY là tốt, hoặc EXISTS thay thế?) [@Oybek - biểu mẫu EXISTS phải có thể đọc được đối với bất kỳ người dùng SQL nào có khả năng, và vì điều này gây ra kết quả trùng lặp, nó không chính xác hoặc không đầy đủ.] – MatBailie

+0

Tôi muốn nói ' m không chắc chắn - nguy cơ không đọc câu hỏi đầy đủ trước khi nhập. Tôi đã đi với EXISTS, tôi đã lưu ý đến bản chất của các bảng. –

0

SELECT ID, "không" như hasB từ một nơi không (id trong (chọn fkid từ b))

đoàn

SELECT ID, "vâng" như hasB từ một nơi id trong (chọn fkid từ b)

+3

Sẽ quét cả hai bảng hai lần, có thể được tạo thành mà không cần quét hai lần. – MatBailie

+0

Nói chung, có thể tốt hơn tham gia tùy thuộc vào các chỉ mục được thiết lập trên bảng và kích thước của các bảng. –

0

Sử dụng truy vấn sau đây

SELECT DISTINCT ID,IF(FKID,'yes','no') AS hasB 
FROM A LEFT JOIN B ON A.ID = B.FKID; 

Bạn sẽ nhận được

01.
+------+------+ 
| ID | hasB | 
+------+------+ 
| 1 | no | 
| 2 | no | 
| 3 | yes | 
| 4 | yes | 
+------+------+ 
4 rows in set (0.07 sec) 
0

Một trong những nên làm: select distinct a.id,(case when b.fkid is null then 0 else 1 end) as hasb from tablea a left join tableb b on a.id=b.fkid

select a.id,(case when exists(select * from tableb where a.id=fkid) then 1 else 0 end) as hasb from tablea a

Các vấn đề liên quan