2010-02-09 3 views
2

C와 외래 키 제약 조건이 둘 다 관련없는 두 개의 테이블 A와 B가 있습니다. A 또는 B 중 하나가 포함되어 있는지 확인하는 SQL 쿼리를 실행해야합니다. 주어진 id의 C입니다. 첫 번째 방법은 A와 B를 모두 사용하는 것이었지만 A와 B는 관련이 없으므로 작동하지 않습니다.하나의 테이블에 column = x가있는 행이 있는지 확인하기위한 단일 SQL 쿼리

아이디어가 있으십니까?

+0

"A 또는 B 중 하나가 포함 된 경우"는 무엇을 의미합니까? 달성하려는 결과물은 무엇입니까? –

+0

A.someFK 또는 B.someFK = 제공된 값이면 1을 반환하고 싶습니다. jdbc를 통해 두 개의 쿼리를 실행할 수 있고 Java의 로직을 수행 할 수 있지만 훨씬 더 명확한 JDBC 쿼리가 하나만있을 수 있습니다. – benstpierre

답변

1

100 % 확신 할 수 없지만 C의 ID와 일치하는 A와 B의 요소를 반환하려는 경우이 작업을 수행합니다.


Select c.*, a.*, b.* 
From c.id 
    Left Outer Join a On a.id = c.id 
    Left Outer Join b On b.id = c.id 
Where c.id = @somevalue and (a.id Is Not Null or b.id Is Not Null) 

여기서 @somevalue는 찾고있는 값입니다.

+0

성능 현명한, 항상 액세스 할 수있는 int 테이블 'a', 'b'및 'c'가되므로 최상의 솔루션은 아닙니다. 'c'에 전혀 액세스 할 필요가 없으며 'a'에 액세스하고 'a'가 일치하지 않는 경우에만 'b'에 액세스 할 수 있습니다 (또는 그 반대). –

+0

흥미로운 점 - 염두에 두어야 할 가치가 있습니다. –

5
Select 1 
From DUAL 
Where Exists (Select null From Table_A Where a.fk = :id) OR 
     Exists (Select null From Table_B Where b.fk = :id); 
+0

"from dual"은 "from table_c"보다 좋을 것입니다. 그렇지 않으면 조건을 지정하지 않았으므로 table_c의 각 행에 대해 하나의 결과 행을 얻습니다. – araqnid

+0

좋은 지적. FROM에 대해 정말로 생각하지 않았습니다 –

+0

FTFY ........... –

2

실제로 조합을 사용할 수 있습니까? 하지만 UNION이 아닌 UNION ALL을 사용해야하는 이유는 무엇입니까? 하나의 공통 항목을 선택하면됩니다.

SELECT 1 
FROM 
     (select A.fk from A inner join C on A.FK = C.pk 
     UNION 
     select B.fk from B inner join C on B.FK = C.pk) AS bothTables 
WHERE fk = 'desiredValue'; 

이것은 올바르게 작동합니다.

MySQL의 다음 표에서 myValue = 1로 테스트하여 검증했습니다.

mysql> select * from A; 
+------+--------+------+ 
| pk | value | fk | 
+------+--------+------+ 
| 1 | ape | 2 | 
| 2 | fjfjfj | 3 | 
+------+--------+------+ 
2 rows in set (0.00 sec) 

mysql> select * from B; 
+------+--------+------+ 
| pk | value | fk | 
+------+--------+------+ 
| 1 | katt | 1 | 
| 2 | fjfjfj | 3 | 
+------+--------+------+ 
2 rows in set (0.00 sec) 

mysql> select * from C; 
+------+-------+ 
| pk | value | 
+------+-------+ 
| 1 | hei | 
| 2 | nei | 
| 3 | jeg | 
+------+-------+ 
3 rows in set (0.00 sec) 
관련 문제