2011-02-03 3 views
1

두 개의 제품 테이블이 있습니다. 표 A는 "기본"표입니다 (데이터 피드는 매주 자동으로 업데이트됩니다). 표 B는 표 A의 값을 수동으로 겹쳐 쓰는 데 사용되며 표와 동일한 열과 몇 가지가 더 있습니다. 두 테이블은 항상 동일한 UniqueID 열을가집니다.선택시 다른 테이블이있는 MySQL 테이블 덮어 쓰기/결합

B의 값이 null이 아니라면 B의 값을 덮어 쓰고 A의 모든 값과 B의 모든 값을 가져 오는 select 문이 필요합니다. B의 값이 null이거나 = 0 또는 0.00과 같은 열 (정수로 설정된 열 2 개의 소수점이 있고 "0"으로 채워짐).

LEFT JOIN을 사용했지만 null 값과 "0"값에 문제가 있습니다.

저는 PHP에서 데이터를 사용하고 있으며, 단지 1 행만 가져와야 할 때 처리 할 수 ​​있습니다. 나는 각각에 대해 쿼리하고, A를위한 assoc 배열을 추출하고, B 배열을 필터링 한 다음 추출한다. 하지만 그 과정은 20-200 행을 끌어 당기기 시작할 때 매우 까다로워집니다.

표 A는 약 400,000 개의 행을 가지며 B가 10,000-20,000을 넘는 것을 볼 수 없습니다.

도움 주셔서 감사합니다.

업데이트 : 다음은 내가 작업해야하는 코드입니다.

SELECT a.UniqueId, IF(b.Color, b.Color, a.Color) as Color, IF(b.Price1 = 0, a.Price1, b.Price1) as Price1, b.SPrice1 FROM productdata a LEFT JOIN product_overrides b ON a.UniqueID = b.UniqueID WHERE a.UniqueID = $prod";

업데이트 2 : 그래서 간단한 낫다. IF()는 null과 0을 모두 처리합니다.

IF은 expr1 TRUE 인

경우 (expr1을, 만일 expr2, expr3를) (expr1을 <> 0 expr1을 <> NULL)는 다음 IF (가)를 expr2이 반환 그렇지 않으면 expr3을 리턴합니다. IF()는 사용 된 컨텍스트에 따라 숫자 또는 문자열 값을 반환합니다.

SELECT a.UniqueId, IF(b.Color, b.Color, a.Color) as Color, IF(b.Price1, b.Price1, a.Price1) as Price1, b.SPrice1 FROM productdata a LEFT JOIN product_overrides b ON a.UniqueID = b.UniqueID WHERE a.UniqueID = $prod";

답변

3

나는이 어떤 일이 모든 시나리오를 커버하는 생각 :

SELECT 
    COALESCE(b.nullablefield, a.nullablefield) as nullablefield, 
    IF(b.intfield = 0, a.intfield, b.intfield) as intfield, 
    IF(b.floatfield = 0, a.floatfield, b.floatfield) as floatfield, 
    ... etc ... 
FROM table_a a 
LEFT JOIN table_b b ON a.UniqueID = b.UniqueID 
+0

SELECT가 UniqueID, COALESCE (b.Price1, a.Price1) Price1로, productdata에서 왼쪽이 ON product_overrides의 B 가입 .UniqueID = b.UniqueID WHERE UniqueID = "5676544"; 은 나를 1064 구문으로 만듭니다. 내가 COALESCE에 대해 * 교환하면 작동합니다. – EricImprint

+1

@EricImprint - 'Price1' 다음에 쉼표가 추가 된 것처럼 보입니다. –