T-запрос-SQL - получает уникальные строки через 2 столбца

Подчеркивание помещается там компилятором и используется компоновщиком. Основной путь:

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, оба из которых содержат функциональный тест ().

5
задан genesis 22 September 2011 в 15:52
поделиться

4 ответа

Добавьте в свой запрос предикат

where X < Y

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

(Это предполагает, что когда вы написали «два заданных значения» вы имели в виду два различных заданных значений; если два значения могут быть одинаковыми, добавьте предикат , где X <= Y (чтобы избавиться от всех "перевернутых" строк, где X> Y ), а затем добавьте отдельный в свой список выбора (чтобы свернуть любые две строки, где X == Y, в одну строку).)

В ответ на комментарии:

То есть, если в настоящее время ваш запрос выберите foo, x, y из некоторой таблицы, где foo <3; измените его на выберите foo, x, y из некоторой таблицы, где foo <3 и x или для во втором случае (где X и Y не являются разными значениями) выберите разные foo, x,y из некоторой таблицы, где foo <3 и x <= y; .

9
ответ дан 13 December 2019 в 22:12
поделиться

Это должно работать.

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
1
ответ дан 13 December 2019 в 22:12
поделиться
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)

Я этого не пробовал. Но это должно сработать.

0
ответ дан 13 December 2019 в 22:12
поделиться

Чтобы получить наивысший и наименьший из каждой пары, вы можете использовать:

(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
0
ответ дан 13 December 2019 в 22:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: