colA에 대한 값 목록으로 table1 을 쿼리 하고 발견되지 않은 값 목록을 다시 가져올 수있는 방법은 무엇입니까?
즉, all_values = [ "a", "b", "c", "d"]
Table1 에 "b", "c"에 대한 colA 가있는 행이 이미 있습니다.
전체 all_values 목록을 보내고 new_values = [ "a", "d"]를 반환 할 수있는 쿼리를 만들고 싶습니다 .
현재는 먼저 모든 existing_values =를 얻은 SELECT colA FROM table1
다음 응용 프로그램 계층 (ruby)에서 new_values = all_values - existing_values 를 수행해야 합니다. 그러나 all_values가 매우 커지면 비용이 많이 드는 루틴이 될 수 있습니다 . 여기에서 db 파워를 활용하여 애플리케이션 계층에 큰 목록을 먼저 반환 할 필요없이 내 목록의 어떤 값이 이미 존재하지 않는지 알려주고 싶습니다.
아래의 David Faber의 확인 된 답변에서 [ Solution ] 누군가가 관심이있을 경우를 대비하여 애플리케이션 레이어 관점 (루비 온 레일)의 솔루션입니다. 사용하려는 모든 모델에 포함될 수 있도록 메서드를 작성했으며 열과 값 목록을 인수로 허용합니다. [ Update ] 임시 테이블 이름을 매개 변수화하고 데이터 유형을 적절하게 설정합니다.
def self.unfound_values_by_column values, column
quoted_values = values.collect {|value| "('#{value}')"}.join(",")
conn = self.connection # get this model's connection if different than base
temp_table_name = "temp_values_for_unfound_lookup_table"
datatype = self.columns_hash[column].sql_type
begin
conn.execute(
"DROP TEMPORARY TABLE IF EXISTS #{temp_table_name}"
)
conn.execute(
"CREATE TEMPORARY TABLE #{temp_table_name} (`#{column}` #{datatype})"
)
conn.execute(
"INSERT INTO #{temp_table_name} (#{column}) VALUES #{quoted_values}"
)
unfound = conn.select_values(
"SELECT temp.`#{column}` FROM `#{temp_table_name}` temp
WHERE NOT EXISTS (
SELECT 1 FROM `#{self.table_name}` my
WHERE my.`#{column}` = temp.`#{column}`
)"
)
ensure
conn.execute(
"DROP TEMPORARY TABLE IF EXISTS #{temp_table_name}"
)
end
unfound
end
가장 좋은 방법은 임시 테이블 (현재 세션에만 표시되고 해당 세션이 종료 될 때 삭제됨)을 만들고에 모든 값을 삽입 all_values
한 다음 기존 테이블과 비교하는 것입니다. 예를 들면
CREATE TEMPORARY TABLE `all_values`
(
`myvalue` VARCHAR(30)
);
-- insert values
SELECT av.`myvalue`
FROM `all_values` av
WHERE NOT EXISTS ( SELECT 1 FROM `table1` t
WHERE t.`ColA` = av.`myvalue` );
나는 개인적으로 WHERE EXISTS
구문이 LEFT JOIN
with 보다 key = NULL
쉽지만 YMMV를 찾습니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다