Подчеркивание помещается там компилятором и используется компоновщиком. Основной путь:
main.c
test.h ---> [compiler] ---> main.o --+
|
test.c ---> [compiler] ---> test.o --+--> [linker] ---> main.exe
Так, Ваша основная программа должна включать заголовочный файл для тестового модуля, который должен состоять только из объявлений, таких как прототип функции:
void test(void);
Это позволяет компилятору знать, что он существует, когда main.c компилируется, но фактический код находится в test.c, тогда test.o.
Это - связывающаяся фаза, которая объединяется эти два модуля.
включением test.c в main.c, Вы определяете тест () функция в main.o. По-видимому, Вы тогда связываете main.o и test.o, оба из которых содержат функциональный тест ().
Добавьте в свой запрос предикат
where X < Y
, и вы никогда не сможете получить строку два, но всегда получите строку один.
(Это предполагает, что когда вы написали «два заданных значения» вы имели в виду два различных заданных значений; если два значения могут быть одинаковыми, добавьте предикат , где X <= Y
(чтобы избавиться от всех "перевернутых" строк, где X> Y ), а затем добавьте отдельный
в свой список выбора (чтобы свернуть любые две строки, где X == Y, в одну строку).)
В ответ на комментарии:
То есть, если в настоящее время ваш запрос выберите foo, x, y из некоторой таблицы, где foo <3;
измените его на выберите foo, x, y из некоторой таблицы, где foo <3 и x
выберите разные foo, x,y из некоторой таблицы, где foo <3 и x <= y;
.
Это должно работать.
Declare @t Table (PK Int Primary Key Identity(1, 1), A int, B int);
Insert into @t values (1, 2);
Insert into @t values (2, 1);
Insert into @t values (3, 4);
Insert into @t values (4, 3);
Insert into @t values (5, 6);
Insert into @t values (6, 5);
Declare @Table Table (ID Int Primary Key Identity(1, 1), PK Int, A Int, B Int);
Declare @Current Int;
Declare @A Int;
Insert Into @Table
Select PK, A, B
From @t;
Set @Current = 1;
While (@Current <= (Select Max(ID) From @Table) Begin
Select @A = A
From @Table
Where ID = @Current;
If (@A Is Not Null) Begin
Delete From @Table Where B = @A;
If ((Select COUNT(*) From @Table Where A = @A) > 1) Begin
Delete From @Table Where ID = @Current;
End
End
Set @A = Null;
Set @Current = @Current + 1;
End
Select a.*
From @tAs a
Inner Join @Table As b On a.PK = b.PK
SELECT O.X, O.Y
FROM myTable O
WHERE EXISTS (SELECT X, Y FROM myTable I WHERE I.X = O.Y AND I.Y = O.X)
Я этого не пробовал. Но это должно сработать.
Чтобы получить наивысший и наименьший из каждой пары, вы можете использовать:
(X+Y+ABS(X-Y)) / 2 as High, (X+Y-ABS(X-Y)) / 2 as Low
Итак, теперь используйте DISTINCT, чтобы получить пары из них.
SELECT DISTINCT
(X+Y+ABS(X-Y)) / 2 as High, (X+Y-ABS(X-Y)) / 2 as Low
FROM YourTable