2013-05-18 2 views
1

Я пытаюсь JOIN 2 таблицы, используя столбцы, которые не являются ни из таблиц соответствующих первичных ключей:Как присоединиться к двум таблицам, когда не используются первичные ключи?

SELECT * 
FROM TableA A 
INNER JOIN TableB B 
ON A.col5 = B.col5 

Однако выше возвращающийся 0 results хотя я знаю наверняка, что есть строки в Table A которого col5 значения соответствуют значениям col5 из Table B.

Что я делаю неправильно?

+4

. , То, что вы знаете «наверняка», похоже, не является реальностью. Ваш синтаксис правильный для соединения. Если в таблице есть соответствующие значения, отличные от NULL, запрос вернет их. –

+0

Plz, обеспечите скрипку, доказывая свои слова – user4035

+0

можно ли получить данные? – Tadgh

ответ

6

Вы запрос:

SELECT * 
FROM TableA A 
INNER JOIN TableB B 
ON A.col5 = B.col5; 

имеет правильный синтаксис для объединения. Если есть соответствующие значения, то он вернет его. (Или, конечно, вы можете вызвать это из приложения, и могут быть ошибки либо в коде приложения, либо в соединении с базой данных, но это еще одна проблема.)

Некоторые случаи, когда значения выглядят одинаково, но не являются :

  • Оба значения являются поплавками. При распечатке они выглядят одинаково. Но бит в конце значения отличается. НИКОГДА НЕ ИСПОЛЬЗУЙТЕ FLOATS ДЛЯ EQUI-JOIN.
  • Одно значение - это число, а другое значение - строка. Преобразование одного из значений приводит к несколько другому значению.
  • Одно значение - это дата/время, а другое - строка. Преобразование одного из значений приводит к несколько другому значению.
  • Значения представляют собой строки. Они различаются в случае. Вы думаете, что abc - это то же самое, что и ABC1, но SQL этого не делает.
  • У вас есть пробелы или другие «скрытые» символы в конце строки.

И еще две причины, по которым я могу думать, но не может быть верно во всех базах данных:

  • Одно значение является символ, а другой VARCHAR (или широкие версии из них). Неявные пробелы в конце символа делают их разными.
  • Один из них - строка в Юникоде и другая строка ASCII. Два символа выглядят одинаково, но их нет.
0

Ваш запрос верный и должен возвращать соответствующие значения в таблице. Но, как вы сказали, в значениях в другой таблице есть невидимое пространство, попробуйте использовать LTRIM и RTRIM для удаления невидимого пространства из значений. LTRIM удаляет пробелы с начала строки, а RTRIM удаляет пробелы из конца строки.

Запрос будет как:

SELECT * FROM TABLEA A INNER JOIN TableB B ON A.col5 = LTRIM (RTRIM (B.col5))

Я надеюсь, что это помогает вам ,

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