Почему SQL Join находит две строки разной длины равными? - PullRequest
2 голосов
/ 25 февраля 2011

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

Left column = "351-561"
Right Column = "351-561-35C"
Result = Joined as equal.

Мой обходной путь состоял в том, чтобы правильно заполнить струны одинаковой длины. Я не понимаю, почему эти две строки будут рассматриваться как равные.

Есть ли какой-то механизм в синтаксисе, который изменит это поведение?

D.

Ответы [ 2 ]

3 голосов
/ 25 февраля 2011

Похоже, вам вполне может понадобиться оператор == в Visual Fox Pro

1 голос
/ 28 февраля 2011

В Visual FoxPro оператор = означает равный.Оператор == означает «точно равный».Другими словами, оператор == сравнивает размер и значение каждого выражения.Например:

* Returns .T. because the first 3 characters on the left match the right.
? "123" = "12345"

* Returns .F. because the expression sizes are not equal.
? "123" == "12345"


Тем не менее, единственная причина, по которой я могу думать, что JOIN потерпит неудачу - это то, что столбцы, к которым вы присоединяетесь, не имеют одинаковый размер.Например, этот запрос возвращает запись 555-1234 только потому, что столбец CHAR автоматически дополняется пробелами.

CREATE CURSOR "MyLeft" (LeftPK I, LeftCode C(20))
INSERT INTO "MyLeft" VALUES(1, "351-561")
INSERT INTO "MyLeft" VALUES(2, "555-1234")

CREATE CURSOR "MyRight" (RightPK I, RightCode C(20))
INSERT INTO "MyRight" VALUES(1, "351-561-35C")
INSERT INTO "MyRight" VALUES(2, "555-1234")

SELECT MyLeft.*, MyRight.* FROM "MyLeft" JOIN "MyRight" ON LeftCode = RightCode


В то время как этот запрос возвращает обе записи, поскольку столбецтип VARCHAR.

CREATE CURSOR "MyLeft" (LeftPK I, LeftCode V(20))
INSERT INTO "MyLeft" VALUES(1, "351-561")
INSERT INTO "MyLeft" VALUES(2, "555-1234")

CREATE CURSOR "MyRight" (RightPK I, RightCode V(20))
INSERT INTO "MyRight" VALUES(1, "351-561-35C")
INSERT INTO "MyRight" VALUES(2, "555-1234")

SELECT MyLeft.*, MyRight.* FROM "MyLeft" JOIN "MyRight" ON LeftCode = RightCode


...