2011-10-04 6 views
1

두 개의 테이블이 있습니다. 한 테이블에는 다른 테이블의 ID를 보유하는 열이 있습니다. 이 열은 하나 이상의 ID를 저장할 수 있으므로 목록으로 저장합니다. 예를 들어 "1,2,3,4"가 값일 수 있습니다. 그래서 다음을 사용하려고합니다 :하위 쿼리와 함께 IN 사용

SELECT TableAValue 
FROM TableA 
WHERE TableAID IN 
(SELECT TableAID FROM TableB WHERE TableBID = 1) 

이것은 하나의 값을 가져옵니다.

지금 내가 사용하는 경우 :

SELECT TableAID FROM TableB WHERE TableBID = 1 

이 네 개의 값을 다시 제공합니다. 또한이 4 개의 값을 복사하여 사용하면 다음을 사용하십시오.

SELECT TableAValue 
FROM TableA 
WHERE TableAID IN 
(1,2,3,4) 

이렇게하면 4 가지 값이 반환됩니다. 이것은 매우 간단하게 보이기 때문에, 나는 그것을 완전히 잘못하고있는 중이거나 작은 세부 사항을 놓치고 있다고 생각합니다. 어떤 아이디어?

+5

1 대 다수 관계에 대해 쉼표로 구분 된 목록을 저장하지 마십시오. 복합 PK'TableAID, TableBID' 및'TableA'에 대한 FK 관계가있는 접합 테이블이 있어야합니다. –

+0

@MartinSmith 질문에 따르면 쉼표로 구분 된 목록으로 데이터를 저장하는 것 같지 않습니다. – Karolis

+2

@Karolis - 당신은 그것을 올바르게 읽지 않았습니다! 특히 두 번째 줄을보십시오. 또한 그들이 implict cast에서 1 개의 결과를 얻는 이유를 설명합니다. 내가 아는 한 모든 첫 번째 숫자가 아닌 문자 (쉼표)는 무시됩니다. –

답변

3

주석 논의에서 언급했듯이 실수는 하나의 필드에 4 개의 값을 저장하는 것입니다. 이렇게하면 정수 목록이 아닌 단일 값 문자열을 보유하게됩니다. 여러 값을 보유하려는 경우 개별적으로 값을 보유 할 여러 위치가 필요합니다.

대신 TableAID에 다른 값을 가진 네 개의 레코드가 있으면 예상대로 작동합니다.

CREATE TABLE TableB (
    TableBID INT, 
    TableAID INT 
) 

INSERT INTO TableB 
     SELECT 1, 1 
UNION SELECT 1, 2 
UNION SELECT 1, 3 
UNION SELECT 1, 4 
UNION SELECT 2, 3 
UNION SELECT 2, 4 
UNION SELECT 2, 5 
UNION SELECT 2, 6 
+0

누군가가 그 말을 할 거라는 느낌이 들었습니다, 고마워요. – Kristian82

관련 문제