2015-09-30 4 views
1

Я пытаюсь получить этот ответ по какой-то причине.Где предложение проверять два столбца в другой таблице

У меня есть две таблицы, Table1 и TABLE2 которые выглядят следующим образом:

Table1:

ID Location Warehouse 
1 London Narnia 
2 Cyprus Metro 
3 Norway Neck 
4 Paris  Triumph 

Table2:

ID Area  Code 
1 London Narnia 
2 Cyprus Metro 
3 Norway Triumph 
4 Paris  Neck 

мне нужно сначала выбрать все из table1 где table1.Location является в table2.AreaИtable1.Warehouse находится в table2.CodeGIVEN THATtable1.Location находится в table2.Area. То есть Я хочу:

ID Location Warehouse 
1 London Narnia 
2 Cyprus Metro 

я получил:

select 
    1.location 
, 1.warehouse 
from table1 1 
where 1.location in (select area from table2) 
and 1.warehouse in (select code from table2) 

Но это не будет работать, потому что нужен второй пункт, где будет выполняться на основе первого, где положение держит верно.

Я также пробовал подобные запросы с объединениями безрезультатно.

Есть ли простой способ сделать это?

ответ

2

Использование exists:

select t.location, t.warehouse 
from table1 t 
where exists (select 1 
       from table2 t2 
       where t.location = t2.area and t.warehouse = t2.code 
      ); 

Я должен отметить, что некоторые вспомогательные базы данных строк Конструкторы с in. Это позволяет сделать:

select t.location, t.warehouse 
from table1 t 
where(t1.location, t1.warehouse) in (select t2.area, t2.code from table2 t2); 
+0

Спасибо @ Gordon. Это сработало для меня. – Johnathan

0

Вы должны использовать JOIN. Я сконструировать запрос в то время :)

EDIT:

SELECT 
    1.location 
, 1.warehouse 
FROM table1 1 
JOIN table2 2 ON 1.location = 2.area AND 1.warehouse = 2.code 
+0

Это был мой первоначальный запрос, но моя таблица1 составляет около 10 000 строк, и приведенный выше запрос возвращает почти миллион строк, и я не могу понять почему. – Johnathan

+0

Возможно, потому, что у вас есть дублирующие строки в одной или обеих таблицах, что приводит к декартовому произведению. – StoYan

1

Может быть, я что-то не хватает, но простое соединение на двух условиях даст вам результат в вашем примере:

select t1.* 
from table1 t1 
join table2 t2 on t1.Location = t2.Area 
       and t1.Warehouse = t2.Code; 

Результат:

| ID | Location | Warehouse | 
|----|----------|-----------| 
| 1 | London | Narnia | 
| 2 | Cyprus |  Metro | 

Sample SQL Fiddle

+0

Вы бы подумали, что не так ли? Но моя таблица1 составляет около 10 000 строк, и приведенный выше запрос возвращает почти миллион строк. – Johnathan

+0

@Johnathan Если он возвращает миллион строк, единственное правдоподобное объяснение состоит в том, что у вас есть миллион строк, соответствующих условиям во второй таблице. Вы можете изменить выбор: 'select select t1. location, t1.warehouse', чтобы исключить дубликаты, но я думаю, что ответ Гордона Линоффа может быть более уместным в вашем случае. – jpw

+1

Вторая таблица содержит только 3500 строк, поэтому это странно.Я отметил ответ, данный @Gordon ниже, поскольку он получает нужные мне результаты. – Johnathan

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