2012-05-10 3 views
1

Новый вопрос. Я хочу сделать что-то вроде:выбрать столбцы, соответствующие

SELECT c1,c2,c3 FROM TABLE t1 
UNION 
SELECT c1,c2,c3 FROM TABLE t2 WHERE t1.c1 IS NOT NULL AND t1.c2 IS NULL; 

так, если у меня есть t1:

c1|c2|c3 
1 | a|v1 
2 | b|v2 

и t2:

c1|c2|c3 
1 | a|v3 
2 | b|v4 
2 | c|v5 
3 | d|v6 

Я хотел бы получить:

c1|c2|c3 
1 | a|v1 
2 | b|v2 
2 | c|v5 

Кто знает как это сделать?

+0

лучшее, что я мог бы получить был левый присоединиться, который будет включать в себя строки с c1 не t1, например, 3 | d | v6 или левое соединение с более строгими условиями, которые исключали бы строки с c2 не в t1, например. 2 | c | v5 – NotGaeL

+1

см. Мой ответ ниже. Я попробовал это sql скрипка http://sqlfiddle.com/#!2/dc795/7 –

ответ

2

Согласно SQL Docs, JOIN быстрее, что SubQueries. попробуйте это:

SELECT c1, c2, c3 
FROM t1 
UNION 
SELECT b.c1, b.c2, b.c3 
FROM t1 a inner join t2 b ON 
     (a.c1 = b.c1) and (a.c1 = b.c1) 
WHERE (b.c1,b.c2) NOT IN (SELECT c1,c2 FROM t1) 

доказать, смотрите здесь: http://sqlfiddle.com/#!2/50a4e/23

+0

Ваш ответ верный, и все же он не работает на моих столах, и я не знаю почему. Что происходит, он повторяет значения с теми же c1 и c2 в обеих таблицах, поэтому результат c1 | c2 | c3 1 | a | v1 2 | b | v2 2 | c | v5 1 | a | v3 2 | b | v4 Вместо просто: c1 | c2 | c3 1 | a | v1 2 | b | v2 2 | c | v5 – NotGaeL

+0

Это потому, что данные в ваших таблицах не совпадают с вашим примером. дайте нам образцы данных, которые почти совпадают с существующими .. –

+0

Я добавил одно значение для каждой таблицы в вашей скрипке (http://sqlfiddle.com/#!2/50a4e/1), воспроизводя проблему. Вы можете видеть строку | c1 | c2) = | 1 | 'b' | повторяется со значениями v1.2 и v3.2. Это должна быть только одна строка, | 1 | 'b' | v1.2 |, одна из t1. И то же самое для строк | 1 | 'a' | от t1 и t2. – NotGaeL

2

Запрос должен выглядеть примерно так, как показано ниже. Однако я не уверен, насколько он эффективен.

SELECT 
    T1.c1, 
    T1.c2, 
    T1.c3 
FROM T1 
UNION  
SELECT 
    T2.c1, 
    T2.c2, 
    T2.c3 
FROM T2 
WHERE ((T2.c1,T2.c2) NOT IN (SELECT t1.c1,t1.c2 FROM t1)) AND 
(T2.c1 IN (SELECT t1.c1 FROM t1)) 
+0

Нет. В этом запросе, если значение c2 повторяется для другого c1 в t2, оно выбирается только для первого c1. Я хочу объединить с моим выбором из t1 что-то вроде выбора всех пар c1, c2 из t2, где c1 находится в выборе из t1, но (c1, c2) не является, а не c2 индивидуально. – NotGaeL

+0

(Я только что исправил его, так что теперь это действительное решение, хотя оно все еще не очень эффективно) – NotGaeL

Смежные вопросы