Цитата:legendar (12:50:00 30/10/2007)
question
legendar (12:50:17 30/10/2007)
есть две таблцы
например
legendar (12:50:19 30/10/2007)
:
legendar (12:50:58 30/10/2007)
table1:
id
tbl2_id
value
table2:
id
value
legendar (12:52:30 30/10/2007)
как получить все такие записи со второй таблици, чтобы небыло соответсвующих записей в первой со значением поля value = 3 например
legendar (12:52:36 30/10/2007)
?
sander (12:53:10 30/10/2007)
JOIN
legendar (12:53:14 30/10/2007)
или наоброт все запсии со второй чтобы все соответсвующие ей записи в первой имели значение поля vaslue = 3
legendar (12:53:19 30/10/2007)
да понятно что Join
sander (12:54:49 30/10/2007)
SELECT * FROM Table2 LEFT JOIN Table2 ON Table1.tnl2ID = Table2.ID
WHERE Table1.Value = 3
legendar (12:55:11 30/10/2007)
но если я возьму left join первую табл ко второй и напишу условие: tbl1.value !=3 то, если в первой таблице есть две записи например так:
id,tbl2_id,value
1,2,3
2,2,4
то поле со второй таблоици с id=2 всеравно выберится
legendar (12:55:26 30/10/2007)
ты не понял
legendar (12:55:54 30/10/2007)
нужно именно не те данные где хоть одно совпадение встречается а чтобы все. либо равнялись либо же все не равнялись
sander (12:59:37 30/10/2007)
нифига не понял....
legendar (13:01:13 30/10/2007)
это в первой таблице:
id,tbl2_id,value
1,2,3
2,2,4
2,1,4
мне нужен запрос который выберет со второй табл те записи для которых нет соответсвующих зхаписей из первой где value = 3
или наоброт те записи для которой все соответсвующие в первой с value = 3
legendar (13:02:11 30/10/2007)
id,tbl2_id,value
1,2,3
2,2,4
3,1,4
в примере это будет для первого условия 3,1,4
для второго ничего
legendar (13:03:08 30/10/2007)
было бы чего если б было например так:
id,tbl2_id,value
1,2,3
2,2,4
3,1,4
4,3,3
5,3,3
6,3,3
тогда было бы tbl2_id = 3
legendar (13:03:15 30/10/2007)
понял?
sander (13:04:37 30/10/2007)
как получить все такие записи со второй таблици, чтобы небыло соответсвующих записей в первой со значением поля value = 3 например
SELECT * FROM Table2
WHERE ID NOT IN (SELECT lbl2_id FROM Table1 WHERE Value =3)
legendar (13:05:42 30/10/2007)
так лучше ))
legendar (13:05:46 30/10/2007)
сенкс
sander (13:06:00 30/10/2007)
legendar (13:07:01 30/10/2007)
а через LEFT JOIN никак?
sander (13:09:35 30/10/2007)
если пересечения выбирать...... это геморой...... тебе ведь нужно те для которых нет соответствия, а JOIN предпологает какое-то соответствие
legendar (13:10:27 30/10/2007)
а если нужно чтобы допустим для всех соответствующих value равнялось 3 ?
sander (13:11:15 30/10/2007)
тогда первый запрос тчо я писал
legendar (13:11:33 30/10/2007)
мне нужно карочь на две части выборку разбить
одна это та у для которой все соответсвующие value = 3
а вторая это всё остальное
legendar (13:11:58 30/10/2007)
нет. первый запрос выдаст не то
legendar (13:12:05 30/10/2007)
нужно чтобы допустим для ВСЕХ соответствующих value равнялось 3
sander (13:12:26 30/10/2007)
если через JOIN ту фигню можешь попробывать так
SELECT * FROM Table2 LEFT JOIN Table1 ON Table2.ID != Table1.tbl2_id AND Table1.Value = 3,
не знаю что выйдет
sander (13:13:53 30/10/2007)
все для которых соответствующие имеют value 3
SELECT * FROM Table2 INNER JOIN Table1 ON Table1.tnl2ID = Table2.ID
WHERE Table1.Value = 3
sander (13:14:44 30/10/2007)
для всех остальных ты делаешь или NOT IN,
или пересечение
sander (13:14:58 30/10/2007)
т.е разность
legendar (13:36:01 30/10/2007)
все для которых соответствующие имеют value 3
SELECT * FROM Table2 INNER JOIN Table1 ON Table1.tnl2ID = Table2.ID
WHERE Table1.Value = 3
legendar (13:36:05 30/10/2007)
нифига подобного
sander (13:46:52 30/10/2007)
чего?
legendar (13:47:40 30/10/2007)
ну а шо ты думаешь LEFT на INNER заменил и всё?
legendar (13:47:49 30/10/2007)
это совсем не то
legendar (13:48:44 30/10/2007)
при LEFT выбераются все записи из первой таблице даже если для них нет ни одной соответствующей во второй
при RIGHT выбераются все записи из второй таблице даже если для них нет ни одной соответствующей в первой
legendar (13:49:13 30/10/2007)
при INNER выбераются все записи из первой и второй таблиц для которых существует хоть какойто соответствие
sander (13:49:30 30/10/2007)
этот запрос выбирает все записи с таблици 2 для которых есть соответствующие записи в табл 1 с Value = 3
legendar (13:50:01 30/10/2007)
ну да
legendar (13:50:22 30/10/2007)
а как выбрать так чтобы ВСЕ соответсвующие имели Value = 3
sander (13:52:28 30/10/2007)
ну этот запрос это и делает
legendar (13:52:59 30/10/2007)
нет
legendar (13:53:29 30/10/2007)
он выбирает те записи для которых хотябы одно соответсвующее VALUE равняется 3
legendar (13:53:44 30/10/2007)
а не ВСЕ соответсвующие VALUE равняются 3
legendar (13:54:34 30/10/2007)
кароч забей. я уже через ID NOT IN (SELECT lbl2_id FROM Table1 WHERE Value =3) сделал
sander (13:56:23 30/10/2007)
ты хочешь сказать что в первой могут быть несколько записей соответствующих одной записи во второй?
legendar (13:56:35 30/10/2007)
ну конечно
legendar (13:56:36 30/10/2007)
!
legendar (13:56:52 30/10/2007)
я ж тебе пример приводил
legendar (13:57:00 30/10/2007)
>legendar (13:03:08 30/10/2007)
>было бы чего если б было например так:
>id,tbl2_id,value
>1,2,3
>2,2,4
>3,1,4
>4,3,3
>5,3,3
>6,3,3
sander (13:57:51 30/10/2007)
понятно.....