2009-09-25 27 views
12

Cho một cơ sở dữ liệu như thế này:sử dụng bản ghi trong sql tại khoản

BEGIN TRANSACTION; 
CREATE TABLE aTable (
a STRING, 
b STRING); 
INSERT INTO aTable VALUES('one','two'); 
INSERT INTO aTable VALUES('one','three'); 
CREATE TABLE anotherTable (
a STRING, 
b STRING); 
INSERT INTO anotherTable VALUES('one','three'); 
INSERT INTO anotherTable VALUES('two','three'); 
COMMIT; 

Tôi muốn làm điều gì đó dọc theo dòng của

SELECT a,b FROM aTable 
WHERE (aTable.a,aTable.b) IN 
(SELECT anotherTable.a,anotherTable.b FROM anotherTable); 

Để có được câu trả lời 'one', 'ba' , nhưng tôi nhận được "gần", ": lỗi cú pháp"

Điều này có thể có trong bất kỳ hương vị nào của SQL không? (Tôi đang sử dụng sqlite)

Tôi có tạo sai tổng khái niệm không? Hay cái gì?

Trả lời

18

mã của bạn hoạt động nếu bạn làm điều đó trong PostgreSQL hoặc Oracle. trên MS SQL, nó không được hỗ trợ

sử dụng này:

SELECT a,b FROM aTable 
WHERE 
-- (aTable.a,aTable.b) IN -- leave this commented, it makes the intent more clear 
EXISTS 
(
    SELECT anotherTable.a,anotherTable.b -- do not remove this too, perfectly fine for self-documenting code, i.e.. tuple presence testing 
    FROM anotherTable 
    WHERE anotherTable.a = aTable.a AND anotherTable.b = aTable.b 
); 

[EDIT]

sans các tuyên bố về ý định:

SELECT a,b FROM aTable 
WHERE  
EXISTS 
(
    SELECT * 
    FROM anotherTable 
    WHERE anotherTable.a = aTable.a AND anotherTable.b = aTable.b 
); 

nó hơi khập khiễng, trong hơn một thập kỷ, MS SQL vẫn không có hỗ trợ hạng nhất cho bộ dữ liệu. Trong cấu trúc tuple là cách dễ đọc hơn so với cấu trúc EXISTS tương tự của nó. btw, JOIN cũng hoạt động (mã của tster), nhưng nếu bạn cần cái gì đó linh hoạt hơn và tương lai, hãy sử dụng EXISTS.

[CHỈNH SỬA]

nói về SQLite, tôi đang tìm kiếm gần đây. yeah, TRÊN tuples không hoạt động

+0

câu trả lời cuối cùng trong 10 phút! không hoạt động trong sqlite :-( đã bỏ phiếu và chấp nhận –

+0

Ngay cả khi nó đã hoạt động trong sqlite, tôi khuyên bạn không nên làm điều đó. Điều này buộc phải nhầm lẫn giữa những người duy trì mã của bạn trong tương lai. duy trì, vì vậy đó là bạn sẽ bị nhầm lẫn) – tster

+4

@tster - Tôi không thấy nguồn gốc của bất kỳ sự nhầm lẫn nào –

2

bạn có thể sử dụng một tham gia:

SELECT aTable.a, aTable.b FROM aTable 
JOIN anotherTable ON aTable.a = anotherTable.a AND aTable.b = anotherTable.b 
+0

Tác phẩm này hoạt động. Cộng với câu trả lời xuất hiện trong 5 phút! Vẫn quan tâm để biết liệu mã đề xuất của tôi có thể/vô vọng bị hiểu lầm/không? –

+0

Vâng, bạn đang cố gắng viết theo cách bạn hiểu, nhưng vấn đề này được giải quyết tự nhiên hơn nhiều bằng cách sử dụng lý thuyết tập hợp, cơ sở của SQL. Việc sử dụng SQL rất phổ biến là tham gia hai bảng để có được giao điểm của chúng, đó là những gì bạn đang cố gắng làm. – RedFilter

+0

@OrbMan: IN trực quan hơn; THAM GIA vào những thời điểm, là quá nhiều máy tính-khoa học-tìm kiếm. Và nó chỉ là vấn đề của việc xây dựng thêm lớp học đầu tiên từ một ngôn ngữ để có thể thực hiện một cái gì đó dễ dàng hơn (suy nghĩ các thuộc tính của C# so với Java setter/getter). Nếu IN hoạt động với giá trị đơn, tôi nghĩ bạn sẽ vui hơn nếu RDBMS bạn đang sử dụng cũng hoạt động trên các giá trị được ghép nối (tuple) –

1

Một lựa chọn khác là sử dụng nối để làm cho 2-tuple của bạn thành một lĩnh vực duy nhất:

SELECT a,b FROM aTable 
WHERE (aTable.a||'-'||aTable.b) IN 
(SELECT (anotherTable.a || '-' || anotherTable.b FROM anotherTable); 

... chỉ cần lưu ý rằng những điều tồi tệ có thể xảy ra nếu một hoặc b chứa dấu phân tách '-'

+1

Giải pháp này sẽ có một bất lợi khác: trình tối ưu hóa truy vấn không thể lý giải về các biểu thức như vậy và do đó không thể tối ưu hóa truy vấn. – iuzuz

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