2011-01-17 3 views
2

У меня есть две таблицы (с одной и той же схеме)Объединение двух SQL таблиц в запросе

Table1 
id title D0 D1 D2 D3 
------------------------------------ 
1 Title1 0.12 3.23 4.90 -0.12 
1 Title1 0.22 0.32 -4.90 0.12 
1 Title1 0.13 1.24 3.50 -0.22 
... 
1 TitleN 1.22 2.33 3.90 -1.56 

и

Table2 
id title D0 D1 D2 D3 
------------------------------------ 
1 Title1 1.42 -0.93 -2.99 3.22 
1 Title1 0.52 3.32 -4.90 0.54 
1 Title1 2.13 1.14 3.50 -0.22 
... 
1 TitleN 3.42 4.37 3.90 -1.26 

Я пытаюсь выяснить, как сделать запрос, как можно это сделать Математика:

SELECT title FROM Table2 WHERE (Table1_Row1_D0*Table2_Row1_D0)+(Table1_Row1_D1*Table2_Row1_D1)+(Table1_Row1_D2*Table2_Row1_D2) < 0.5; 

Однако я бы хотел, чтобы запрос повторялся в строках таблицы 1 и выполнял SELECT по всему Таблица 2. В принципе, я хочу выбрать заголовки из Таблицы 2, где неравенство вычисления встречается во ВСЕХ комбинациях строк из Таблицы 1 и Таблицы 2.

Возможно ли это?

Не уверен, что это важно, но я использую Postgre.

ответ

1

Вы хотите CROSS JOIN

SELECT Table2.title 
FROM Table2 
CROSS JOIN Table1 
WHERE (Table1.D0*Table2.D0)+(Table1.D1*Table2.D1)+(Table1.D2*Table2.D2) < 0.5; 
+0

Почему бы не «ВНУТР. ВСТУПИТЬ?»? – onedaywhen

+0

Действительно хороший вопрос. Стандартное использование CROSS JOIN - это создание «декартового продукта», то есть, CROSSing таблицы M-row с таблицей N-строк даст вам строки M * N. Не существует условия JOIN для CROSS JOIN. Стандартное использование INNER JOIN - поиск совпадающих записей на основе одного или нескольких совпадающих столбцов в двух таблицах. Технически вы можете написать CROSS JOIN как INNER JOIN без соответствующих столбцов, но вы просто путаете людей. – anon

+0

", где неравенство вычисления встречается во ВСЕХ комбинациях строк из Таблицы 1 и Таблицы 2" - это, похоже, не покрывается? Возьмите только 2 строки в t1 и 1 в t2. Скажем row1 возвращает true, а row2 возвращает false для условия, этот запрос STILL показывает table2.title .... этот ответ также может показывать дубликат table2.title много раз .. – RichardTheKiwi

0

Вы должны использовать союз. Единственное ограничение вашего возвращения поля из ваших выбирает должны соответствовать

(SELECT * FROM Table1 WHERE conditions) UNION (SELECT * FROM Table2 WHERE conditions) 

ли ваши чеки на стороне скрипта, пока вы не потянув слишком много данных. У вас также есть возможность добавить sub selects к условию where, чтобы ограничить обе стороны этого запроса union.

2

В принципе, я хочу, чтобы выбрать названия из Table2, где расчет неравенство выполняется против всех подряд сочетание Table1 и Таблица 2.

Для этого вам понадобится обратное условие, в котором не существует равенства в таблице 1 для этой строки Table2.

SELECT distinct title 
FROM Table2 
WHERE NOT EXISTS (
    SELECT * 
    FROM Table1 
    WHERE (Table1.D0*Table2.D0)+(Table1.D1*Table2.D1) 
      +(Table1.D2*Table2.D2) >= 0.5 
) 
+0

Честно говоря, этот ответ является более точным ответом на вопрос вопрос (за исключением того, что кажется синтаксической ошибкой). С другой стороны, мой ответ позволяет вам получать заголовки из обеих таблиц, и поэтому это немного более гибко. – anon

+0

@anon - нет синтаксической ошибки. – RichardTheKiwi

+0

«Table1_Row1_D0»: не должно быть точек там вместо периодов? Я должен признать, что я не знаю диалект постгрескля, поэтому я могу ошибаться. Однако их сайт использует точки: http://www.postgresql.org/files/documentation/books/aw_pgsql/node59.html – anon

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